2016-11-09 4 views
2

デバイスからデータをロギングしていて、そのデータをミリ秒単位でタイムスタンプするコードがあります。fprintf形式を間違って元に戻す

私はこのように作成されたタイムスタンプを格納するためにuint64_tを使用していた。

 

fprintf(ptr,"%ld\n",(long)stamp0); 
 

:私はこのような(それを通じ考えずに)ファイルにタイムスタンプを書いた後

 

struct timespec request; 
clock_gettime(CLOCK_REALTIME, &request); 
uint64_t stamp0 = (uint64_t)((uint64_t)request.tv_sec * 1000 + (uint64_t)request.tv_nsec/1000000); 
 

今私は 1130802699のように見えますが、 1478599582064のように見える私のファイルに間違ったタイムスタンプを持っています。

私のエラーを修正するために何かできますか?

答えて

5

私は、タイムスタンプ11308026991478599552523よりも1478599582064よりも似ていると推測しています。

もしそうなら、あなたは(私はあなたのlongが32ビットで、切り捨てられた値が負の範囲にロールオーバーしていないと仮定しています)1 < < 32の適切な倍数を追加することにより、タイムスタンプを回復できる可能性があります。この場合、それは344回、または各値に加算するために1477468749824です。

32ビット値は6週間ごとにロールオーバーされるため、ファイルがより長い範囲にまたがっている場合は、少し明快にする必要があります。


私がその価値をどのように思いついたのか疑問に思っているなら、後ろ向きに作業する必要があります。

は0xffffffffでマスクすることを意味し、我々はint32_t(おおよそ)へuint64_tを切り捨て知っている、と私たちはいくつかの合理的な仮定(例えば2の補数算術演算を)作る場合:

stamp0 & 0xffffffff 

を差し引くと同等です
stamp0 - (stamp0 & 0xffffffff00000000) 

この差は、広い範囲の値にわたって一定であり、実際の値と期待値との差にほぼ等しくなります。

1478599582064 - 1130802699は、1477468779365または0x15800007365です。

だから私は戻って追加するオフセットは0x15800000000だと思います。

+0

ありがとうございます。タイムスタンプは完全一致ではありませんでしたので、あなたが正しいと思われます。幸運なことに1時間ほどしか過ぎず、ロールオーバーは問題ではありません。 '344'という値にどうやって到着したか教えてください。 – James

+0

本当に助けてくれて、あなたは私に多くの苦痛を救ってくれました。 – James

関連する問題