Python:十六进制转日期时间
23 DD 78 34 = 2013-01-28 21:52:XX //second not sure
92 e3 78 34 = 2013-01-28 22:14:XX
d4 e3 78 34 = 2013-01-28 22:15:XX
16 e4 78 34 = 2013-01-28 22:16:XX
怎么把十六进制转换成日期和时间呢?这不是UNIX时间格式。
2 个回答
1
所以,这些十六进制的整数显然是小端格式的。要把它们转换成整数:
880336163 > 2013-01-28 21:52:XX
880337810 > 2013-01-28 22:14:XX
880337876 > 2013-01-28 22:15:XX
880337942 > 2013-01-28 22:16:XX
再考虑最后三个数之间的差值,这个值是以秒为单位的。
使用提供的日期,往回推算对应的秒数,你会得到以下的纪元日期:
1985-03-07 20:02:37
1985-03-07 19:57:10
1985-03-07 19:57:04
1985-03-07 19:56:58
即使考虑到时间偏差和采样误差,这个纪元看起来也很奇怪。我记得GPS的纪元是1980年1月6日……你需要更多的样本来确定一个准确的纪元。
无论如何,这里是我用来推导纪元的脚本:
import datetime as dt
data = [
('23 DD 78 34',(2013,01,28,21,52)),
('92 e3 78 34',(2013,01,28,22,14)),
('d4 e3 78 34',(2013,01,28,22,15)),
('16 e4 78 34',(2013,01,28,22,16)),
]
def hex_to_int(string):
string = ''.join(reversed(string.split()))
return int(string,16)
for (string,date) in data:
secs = hex_to_int(string)
date = dt.datetime(*date)
delta = dt.timedelta(seconds=secs)
print date - delta
一旦你有了纪元,就像上面那样把十六进制字符串转换成整数,然后把它加到纪元上,就能得到对应的日期和时间:
import datetime as dt
epoch = dt.datetime(YYYY,MM,DD,HH,MM,SS)
def hex_to_datetime(string):
delta = dt.timedelta(seconds=hex_to_int(string))
return epoch + delta
希望这对你有帮助。
1
这个十六进制的值看起来是小端格式编码的,但似乎没有使用秒作为刻度值:
>>> values = [
... (0x3478dd23, datetime(2013, 1, 28, 21, 52)),
... (0x3478e392, datetime(2013, 1, 28, 22, 14)),
... (0x3478e3d4, datetime(2013, 1, 28, 22, 15)),
... (0x3478e416, datetime(2013, 1, 28, 22, 16))
... ]
...
>>> for s, dt in values:
... print dt - datetime.fromtimestamp(s)
...
5544 days, 19:02:37
5544 days, 18:57:10
5544 days, 18:57:04
5544 days, 18:56:58
由于偏移量随着时间的推移在缩小,我计算了一个修正因子:
>>> ts_delta = values[1][0] - values[0][0]
>>> ts_delta
1647
>>> dt_delta = values[1][1] - values[0][1]
>>> dt_delta
datetime.timedelta(0, 1320)
>>> dt_delta = dt_delta.days * 60*60*24 + dt_delta.seconds
>>> dt_delta
1320
>>> factor = float(dt_delta) / float(ts_delta)
>>> factor
0.8014571948998178
1647个刻度 = 1320秒。
现在,如果我们把这个因子应用到时间戳上,偏移量基本保持不变(除了秒的部分,因为你不知道它们的值,所以我在源数据中只用了0)。
>>> for s, dt in values:
... print dt - datetime.fromtimestamp(s * factor)
...
7567 days, 17:16:08.233151
7567 days, 17:16:08.233151
7567 days, 17:16:15.336976
7567 days, 17:16:22.440802
考虑到这一点,你可以使用这个偏移量和因子来转换原始值:
>>> offset = values[0][1] - datetime.fromtimestamp(values[0][0]*factor)
>>> offset
datetime.timedelta(7567, 62168, 233151)
def hex_to_datetime(s):
return datetime.fromtimestamp(s*factor) + offset
>>> for s, dt in values:
... print hex_to_datetime(s), dt
...
2013-01-28 21:52:00 2013-01-28 21:52:00
2013-01-28 22:14:00 2013-01-28 22:14:00
2013-01-28 22:14:52.896175 2013-01-28 22:15:00
2013-01-28 22:15:45.792349 2013-01-28 22:16:00
这对我来说看起来很有希望。