使用二进制数据字符串提取日期和时间

时间:2014-06-20 20:42:30

标签: python datetime struct reverse-engineering

我有第三方应用程序将时间序列数据存储为打包的二进制文件。我正在尝试创建一个工具来转换存储在此文件中的数据。

下面显示的是此数据的快照。

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 个答案:

答案 0 :(得分:3)

如果你紧接double之一的8个字节,并将其视为整数(低端,如双精度),那么你得到以下数字:

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)