我有一个从设备接收 GPS 报告的项目。它有效,但我正在彻底修改我的单元测试并添加集成测试,以便在发布到生产时减少恐慌。一旦特定的设备模型使用非常紧凑的二进制文件作为报告,我花了过去三周的时间对我自己的解析器进行逆向工程,这样我就可以为单元和集成测试生成随机或特定的报告。
我很确定我已经弄清楚了除了时间戳之外的所有部分。我似乎无法生成正确的时间戳,所以我决定寻求帮助。
设备的文档将时间戳指定为:
时间戳是一个 4 字节字段,用于标识报告的生成时间(可能与传输报告的时间不同)。该字段的值是一个无符号整数,表示采用以下编码的协调世界时 (UTC):
<seconds> = <timestamp> % 60
<minutes> = int( <timestamp> / 60 ) % 60
<hours> = int( <timestamp> / (60*60) ) % 24
<days> = 1 + int( <timestamp> / (60*60*24) ) % 31
<month> = 1 + int( <timestamp> / (60*60*24*31) ) % 12 (where 1 = Jan, 2 = Feb, etc.)
<year> = 2000 + int( <timestamp> / (60*60*24*31*12) )
从我一直用于测试的真实设备的一份报告中,我知道
2020-06-03 22:01:52 +00:00
是 656460112
,但我不知道如何将时间戳传递给我的方法并生成该值。这是我到目前为止的方法:
private const int _millennium = 946684800;
private static byte[] GetLocatedAtUtcBytes(
DateTimeOffset locatedAtUtc) {
var bytes = new byte[4];
BinaryPrimitives.WriteInt32BigEndian(bytes, (int)(locatedAtUtc.ToUnixTimeSeconds() - _millennium));
return bytes;
}
我认为我必须以某种方式扣除千年,因为他们的公式希望我明确添加
2000
来获得年份,但这似乎并没有让我到达我需要的地方。我的方法生成 644536912
作为值,恰好是 138 天休息。盲目加138,其他日期都解决不了。
我希望能得到一些帮助来生成正确的值,因为我已经花了太多天了,而我现在只是在原地打转,并且变得斗鸡眼。这可能很简单,但我再也看不到了。任何帮助将不胜感激!
如果假设 644536912 是距离给定时间的秒数,则起始时间为 8/16/1999 的凌晨 12:00。因此,所有时间都将从此时开始,给定一个刻度是一秒的间隔。
DateTime 纪元开始 = new DateTime(2020, 6, 3, 22, 1, 52);
int cdrTimestamp = -656460112;
日期时间结果 = epochStart.AddSeconds(cdrTimestamp);
结果 = 1999 年 8 月 16 日中午 12:00