从二进制数据字符串中提取日期和时间

1 投票
1 回答
1404 浏览
提问于 2025-04-18 10:34

我有一个第三方应用程序,它把时间序列数据存储在一个打包的二进制文件里。我正在尝试制作一个工具,把这个文件里的数据转换出来。

下面是这个数据的一部分快照。

41 16 00 00 01 00 D7 11 00 00 01 00 E8 55 A6 20 08 1E D0 08 00 00 00 60 59 D5 
86 40 03 E8 F5 2C 22 08 1E D0 08 00 00 00 00 C0 0B 87 40 01 E8 95 B3 23 08 1E 
D0 08 00 00 00 40 1E 00 87 40 01 E8 35 3A 25 08 1E D0 08 00 00 00 60 13 F8 86
40 01 E8 D5 C0 26 08 1E D0 08 00 00 00 40 65 09 87 40 01 E8 75 47 28 08 1E D0 
08 00 00 00 20 8A F6 86 40 01 E8 15 CE 29 08

我知道这一块数据对应着以下的数值。

5/13/2013 17:46:11.558  730.6686401
5/13/2013 17:46:14.118  737.46875
5/13/2013 17:46:16.678  736.0147705

我可以提取出这些数值,它们的类型是 double。比如,8个字节 00 00 00 60 59 D5 86 40 对应的数值是 730.6686401

但是我不知道怎么提取出日期时间格式。我知道它在这个字符串的某个地方埋藏着。我该怎么弄清楚这个时间的格式是什么呢?

我一直在用 Python 的 struct 模块来进行类型转换。

有没有人有什么想法?

1 个回答

4

如果你查看一个 double 类型数据前面的8个字节,把它当成一个整数来看(低字节在前,就像这个 double),你会得到以下这些数字:

635040567715583464
635040567741183464
635040567766783464

如果你把这些数字除以10的7次方,你就能得到一个以秒(还有小数秒)为单位的日期。至少在分钟、秒和小数秒上是对应的。不过在小时上,我发现有个偏差,可能是时区的问题吧。对于完整的日期,735000这个天数对应的是2013年5月13日。这个数字表示的是从公元1年开始算起的天数:

>>> datetime.date(1,1,1) + datetime.timedelta(735000)
datetime.date(2013, 5, 13)

(*) 这个数字是这些数字除以10的7次方再乘以60再乘以60再乘以24得到的

或者可以一步到位:

>>> x = 635040567715583464 / 10.**7 / 86400
>>> datetime.datetime(1,1,1) + datetime.timedelta(x)
datetime.datetime(2013, 5, 13, 15, 46, 11, 558353)

撰写回答