いつから何秒も言いませんでした。1970-01-01 以降のようです。エポック (1970-01-01) と予想される最低値の間の秒数であるファッジ ファクターを計算できます。次に、各値を調整します...vadj = float(hi32 - fudge) + lo32 / 2.0 ** 32
max(hi32) と min(lo32) の差が約 6 日分未満の場合 (パケット キャプチャの演習 (?) には十分なはずです)、hi32 - fudge には 19 ビットしか必要ありません。19 ビット + 32 ビットは 51 ビットで、Python float IIRC の精度の範囲内です。
ここでは遅いので、詳細な分析は行いませんが、上記で全体像がわかるはずです。
編集:@unwindの答えがうまくいかない理由:
>>> a = 0x00000001/4294967296.0 + 0x4ca1f350
>>> b = 0x00000002/4294967296.0 + 0x4ca1f350
>>> b - a
0.0
>>>
編集 2: str()、repr()、timestamp_from_str() 以外に、タイムスタンプに対してどのような操作を行いますか? 違いは頭に浮かぶすべてです。次のようなものを使用できます。
>>> class TS64(object):
... def __init__(self, hi, lo):
... self.hi = hi
... self.lo = lo
... def float_delta(self, other):
... hi_delta = self.hi - other.hi
... # check that abs(hi_delta) is not too large, if you must
... return hi_delta + (self.lo - other.lo) / 4294967296.0
...
>>> a = TS64(0x4ca1f350, 1)
>>> b = TS64(0x4ca1f350, 2)
>>> b.float_delta(a)
2.3283064365386963e-10
>>> repr(_)
'2.3283064365386963e-10'
>>>
私の「必要がある場合」のコメントについて: 観測が 6 日以上離れている場合、最後の精度 (秒 / 2 ** 32) が本当に必要ですか? IMHO、float(difference(ts1, ts2))代わりにを実行すれば、問題float(ts1) - float(ts2)ありません。
編集 3:あいまいさ/矛盾の警告
質問を編集して、次の問題に対処してください。
あなたはコメントで、「」「私が見ているドキュメントでは、小数部分がナノ秒の精度を持っていると言っています(具体的には、32ビットのうち29ビットを出力します)」」と言っています。そのドキュメントの URL を提供してください。
1 秒は 1000000000 ( 10**9) ナノ秒です。小数部分にはmath.log(10**9, 2)、29 ビットではなく、切り上げ (つまり、29.897352853986263 の切り上げ、つまり 30) ビットが必要であると予想されます。説明してください。
答えてください: 利用可能な 32 ビットのうち、29 ビットと 30 ビットのどちらが小数部を含み、3 ビットと 2 ビットのどちらが常にゼロですか?
次に、 で割ることによってナノ秒を秒に変換することが期待され10**9ます。ただし、あなたの質問のステートメント """the number 4ca1f350 9481ef80 translates to 1285682000.580107659""" は で割ることと一致してい2**32ます。実際、0x9481ef80 は 2,491,543,424 で、2 倍以上です10**9。説明してください。「に翻訳する」ステートメントのソースは何ですか? 他に例はありますか?