4

私は、8バイト/64ビットのタイムスタンプがどうあるべきかを理解しようとしています。

import datetime
GPS_EPOCH = datetime.datetime(1980, 1, 6)
t1 = "\x00\x00\xBF\x13\xDB\x79\xC0\x00" # expected: 2012-10-04 01:00:51.759
t2 = "\x00\x00\xC0\x13\xDB\x79\xC0\x00" # expected: 2012-10-04 01:00:51.760
t3 = "\x00\x00\xC2\x13\xDB\x79\xC0\x00" # expected: 2012-10-04 01:00:51.763
t4 = "\x00\x00\x80\xE7\xFB\x79\xC0\x00" # expected: 2012-10-04 01:45:40.960

t1GPS_EPOCHの結果でありt2、GPS_EPOCHからオフセットする必要がある値だと思います。ただし、期待される結果の日時と一致する結果が得られないようです。

私は読んでいますが、これが2つの部分に分割され、1つはおそらく小数で、もう1つは秒(それぞれ4バイト?)になるのは理にかなっているようです。ただし、GPSエポックに基づくタイムスタンプ形式のリファレンスは見つかりませんでした。

これをどのようにして期待される結果に変換できるかについてのアイデアはありますか?

4

3 に答える 3

8

私はそれを持ってます。あなたは十分な例を提供しました。

>>> t1 = "\x00\x00\xBF\x13\xDB\x79\xC0\x00" # expected: 2012-10-04 01:00:51.759
>>> import struct
>>> import datetime
>>> GPS_EPOCH = datetime.datetime(1980, 1, 6)
>>> t1_unpacked = struct.unpack('<q', t1)[0]
>>> t1_seconds = t1_unpacked / 52428800
>>> t1_us = int(round((t1_unpacked % 52428800) / 52.428800, 0))
>>> GPS_EPOCH + datetime.timedelta(seconds=t1_seconds, microseconds=t1_us)
datetime.datetime(2012, 10, 4, 1, 0, 51, 758750)

すべてを一緒に入れて:

def gps_time(timestamp):
    unpacked = struct.unpack('<q', timestamp)[0]
    seconds = unpacked / 52428800
    microseconds = int(round((unpacked % 52428800) / 52.428800, 0))
    return GPS_EPOCH + datetime.timedelta(seconds=seconds, microseconds=microseconds)

>>> gps_time(t2)
datetime.datetime(2012, 10, 4, 1, 0, 51, 760000)
>>> gps_time(t3)
datetime.datetime(2012, 10, 4, 1, 0, 51, 762500)
>>> gps_time(t4)
datetime.datetime(2012, 10, 4, 1, 45, 40, 960000)
于 2012-10-11T02:52:23.197 に答える
2

struct標準ライブラリのモジュールを使用して、8 バイトが 64 ビット整数をエンコードしているかどうかを確認できます。

>>> import struct
>>> number = struct.unpack('q', "\x00\x00\xBF\x13\xDB\x79\xC0\x00")
>>> "{:,}".format(number)
'54,177,177,364,529,152'

それはかなり大きな整数です!しかし、それはあなたがリストしたエポックに関連していますか? おそらくそうではありません...

多分それは整数ではありません。私は生の GPS モジュールを使って遊んでいましたが、そのデータは NMEA センテンスでシリアルとして出力されます。それらのフォーマット情報はオンラインで見つけることができます。

于 2012-10-10T09:04:44.567 に答える
1

編集済み

申し訳ありませんが、これは解決策ではありません。他の誰かが詳細に触れる時間があれば、いくつかの開始点に過ぎません。

最初の日付の保存された「非表示」番号は次のとおりです。

import datetime
from datetime import datetime, timedelta
GPS_EPOCH = datetime(1980, 1, 6)
date_1 = datetime(2012,10,04, 01,00,51,759)
d=(date_1 - GPS_EPOCH)
( d.days * 24 * 60 * 60 + d.seconds ) * 1000 + d.microseconds

---->   1.033.347.651.759   <----

しかし、最初のデータの 16 進コードを解凍して得られる数値は次のとおりです。

struct.unpack('q', "\xBF\x13\xDB\x79\xC0\x00\x00\x00" )[0]

---->     826.678.121.407   <----

\xBF を最下位桁の位置に移動していることに注意してください。サンプルでは 1 ミリ秒が \xC0 - \xBF であるため、これを行います。最初のサンプルでは、​​最下位桁は \xBF のようです。

次に、データ サンプルの式は次のようになります。

 milliseconds =  ( 1033347651759 - 826678121407 ) +  unpack_your_string_with_offset
 GPS_EPOCH + milliseconds

少ないデータでテスト...

>>> milliseconds =  ( 1033347651759 - 826678121407 ) + \ 
                    struct.unpack('q', "\xBF\x13\xDB\x79\xC0\x00\x00\x00" )[0]
>>> 
>>> GPS_EPOCH + timedelta( milliseconds = milliseconds)
datetime.datetime(2012, 10, 4, 1, 0, 51, 759000)

新しい数式を確認または推測するために、より多くのデータ サンプルと予想される結果を投稿してください。

@leon_matthews から unpack メソッドを取得しました: +1 ;)

Raimanの誰かが解決策を見つけてくれることを願っています。私はあなたの答えに従います。

于 2012-10-10T09:00:06.247 に答える