我有一些代码正在记录来自设备的数据,并使用系统时间(以毫秒为单位)为该数据添加时间戳。
我使用 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
。
我可以做些什么来修复我的错误吗?
最佳答案
我猜测时间戳 1130802699
应该更像 1478599552523
而不是 1478599582064
。
如果是这样,您可以通过添加适当的 1<<32 倍数来恢复时间戳(我假设您的 long
是 32 位,并且截断的值不会滚动超过负值范围)。在本例中,为每个值添加 344 次,即 1477468749824
。
您的 32 位值将每 6 周左右滚动一次,因此如果您的文件跨越较长范围,您可能需要采取一些更聪明的措施。
如果你想知道我是如何得出这个值的,我们应该逆向思考。
我们知道我们将 uint64_t
截断为(大致)int32_t
,如果我们做出一些合理的假设(例如 2 的补码算术),这意味着使用 0xffffffff 进行掩码:
stamp0 & 0xffffffff
这相当于减法
stamp0 - (stamp0 & 0xffffffff00000000)
此差异在很大的值范围内都是恒定的,并且大约等于实际值和预期值之间的差异。
1478599582064 - 1130802699 是 1477468779365,或 0x15800007365。
所以我认为要添加的偏移量实际上是 0x15800000000。
关于c - 神奇地撤消 fprintf 格式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40503962/