4
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 

16進数を日時に変換する方法は?UNIXの日付ではありません

4

2 に答える 2

1

16 進値はリトル エンディアンでエンコードされているように見えますが、目盛り値として秒を使用するように継ぎ目はありません。

>>> 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

これは私にはかなり有望に見えます。

于 2013-01-28T15:36:59.370 に答える
1

したがって、16 進整数は明らかにリトルエンディアンです。整数に変換するには:

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

最後の 3 つの間のデルタを考慮すると、値は秒単位です。

提供された日付を使用して、対応する秒数をさかのぼると、次のエポック日付が得られます。

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

エポックを取得したら、上記のように 16 進文字列を整数に変換し、それをエポックに追加して、対応する日時を取得します。

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

お役に立てれば。

于 2013-01-28T15:41:56.077 に答える