我正在研究一个晦涩的网络协议(protocol)的实现,其中一个要求是每个数据包头都应该包含一个 56 位时间戳,前 4 个字节包含自纪元以来的整数秒数,并且其余 3 个字节用于包含当前秒的二进制小数。换句话说,最后 3 个字节应该表示自上一秒以来的 2^-24 秒数。时间戳的第一部分是微不足道的,但我正在努力实现将存储时间戳的小数部分的 C 代码。谁能阐明如何做到这一点?
为了完整起见,这是我目前拥有的时间戳代码。 primaryHeader
是一个 char*
,我用它来存储数据包的 header 数据。您可以假设 primaryHeader
中的前 6 个字节包含有效的、不相关的数据,并且 primaryHeader
足够大以包含需要存储在其中的所有内容。
int secs = (int)time(NULL);
memcpy(&primaryHeader[7], &secs, sizeof(int));
// TODO: Compute fractional portion of the timestamp and memcpy to primaryHeader[11]
最佳答案
time()
函数只会给你秒数。你是一个更高分辨率的计时器。
struct timespec t;
timespec_get(&ts, TIME_UTC);
int secs = t.tv_sec; // Whole seconds
int frac = ((int64_t)t.tv_nsec << 24) / 1000000000; // Fractional part.
如果这不可用,您可以使用 clock_gettime
,但 clock_gettime
在 Windows 上找不到。
关于c - 在 C 中将时间戳存储为二进制分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58631706/