2016-11-09 64 views
2

我有一些代碼是從設備記錄數據,並用系統時間以毫秒爲單位對數據進行時間戳。魔法撤消fprintf格式錯誤

我使用的是uint64_t存儲的時間戳,這是這樣創建的:

 

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

然後我寫了這樣的記錄到文件(不經過思考的話)的時間戳:

 

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

現在我的文件中有不正確的時間戳,看起來像1130802699,但應該看起來像1478599582064

有什麼我可以做,以解決我的錯誤?

回答

5

我猜測時間戳1130802699應該更像14785995525231478599582064

如果是這樣,你可以通過添加1 < < 32適當多恢復時間戳(我假設你long是32位,截斷值不超過擀成負範圍)。在這種情況下,這是344次,或1477468749824添加到每個值。

您的32位值將每6周左右翻轉一次,因此如果您的文件跨越較長範圍,您可能必須做點更聰明的事情。


如果你想知道我是如何得出這個價值的,我們應該倒退。

我們知道我們截斷uint64_t到(大約)int32_t,如果我們做一些合理的假設(例如,2的補碼運算),這意味着爲0xffffffff掩蔽:

stamp0 & 0xffffffff 

這相當於減去

stamp0 - (stamp0 & 0xffffffff00000000) 

這個差異在一個大的數值範圍內是恆定的,大約等於實際值和期望值之間的差值。

1478599582064 - 1130802699是1477468779365或0x15800007365。

所以我認爲加回來的偏移量實際上是0x15800000000。

+0

謝謝,時間戳不完全匹配,所以我懷疑你是對的。幸運的是,只有一個多小時的時間,所以翻車不應該是一個問題。你能向我解釋一下你是如何得到'344'價值的嗎? – James

+0

謝謝,這真的有幫助,你救了我很多痛苦。 – James