c - 神奇地撤消 fprintf 格式错误

标签 c

我有一些代码正在记录来自设备的数据,并使用系统时间(以毫秒为单位)为该数据添加时间戳。

我使用 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/

相关文章:

c - 在 OpenSSL 中定义常量 BIGNUM

c - 如何在 C 中使用指针算术将值从一个数组复制到另一个数组

c - 如何简单地生成与所有base64编码兼容的随机base64字符串

c - 使用指针替换值

在 Cortex-M3 上使用带有预制地址的位带宏时出现问题

php - 我如何从 php 调用 C 程序中的函数?

c - 使用 .o 文件构建 .ko 文件

c++ - 如何用C/C++高效的合成Bayer Raw10数据?

c++ - 在一行代码中输入 2 个十六进制数字和一个字符串

c++ - 如何使用 SIMD 比较两个 char vector 并将结果存储为 float ?