从二进制数据字符串中提取日期和时间
我有一个第三方应用程序,它把时间序列数据存储在一个打包的二进制文件里。我正在尝试制作一个工具,把这个文件里的数据转换出来。
下面是这个数据的一部分快照。
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)