我想通过 CAN 接口(interface)发送时间戳以供分析。
因此我使用了 Linux-can/can-utils 中的 cansend。在 Linux shell 上,我可以通过以下方式发送当前时间
可以发送 can0 123#$(printf "%x"$(date +%s%N))
。
date +%s%N
给我输出 1566378614461677537
(19 位数字),用 printf "%X"$(date +%s%N)
给我所需的输出 B15CE567BA9D338E
(这是 8 字节 CAN 帧)
然后用“cansend”发送。另一方面,在我的 C 代码中
struct timeval start;
gettimeofday(&start, NULL);
printf("%.0f%.0f\n", (double)( start.tv_sec) , (double)(start.tv_usec)); //for debug
printf("%x%.0X.%0X%X\n", (double)(start.tv_sec), (double)(start.tv_usec)); //desired output
给我输出 1566382713648209
(这是没有纳米的 16 位数字,但对我来说足够准确)但如果我使用
printf("%x%.0X%0X%X\n", (double)(start.tv_sec), (double)(start.tv_usec))
然后输出是 09E40000041D757460
。
如何获得所需的输出 B15CE567BA9D338E
?
最佳答案
只需将其转换为具有纳秒分辨率的十六进制值...
#include <stdio.h>
#include <time.h>
int main() {
struct timespec tp;
clock_gettime(CLOCK_REALTIME, &tp);
unsigned long long tmp = tp.tv_sec * 1000ull * 1000 * 1000 + tp.tv_nsec;
printf("%llX", tmp);
}
不要使用 gettimeofday,它自 POSIX 2008 以来已被弃用。
关于c - 如何将 C-printf 字符串格式化为等于 bash-printf 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57589781/