我正在研究一种晦涩的网络协议,其中一项要求是,每个数据包标头都应包含56位的时间戳,前4个字节应包含自纪元以来的秒数,并且剩余的3个字节用于包含当前秒的二进制分数。换句话说,最后3个字节应表示自前一秒以来的2 ^ -24秒。时间戳的第一部分是微不足道的,但是我正在努力实现将存储时间戳的小数部分的C代码。任何人都可以阐明如何执行此操作吗?
为了完整起见,这是我到目前为止的时间戳代码。 primaryHeader
是我用来存储数据包头数据的char*
。您可以假设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()
功能只会给您几秒钟。您需要类似clock_gettime()
的内容。
struct timespec t;
clock_gettime(CLOCK_REALTIME, &t);
int secs = t.tv_sec; // Whole seconds
int frac = ((int64_t)t.tv_nsec << 24) / 1000000000;
据我所知,这在Windows上不可用。