如何将C-printf字符串格式化为与bash printf字符串相等
我想通过CAN接口发送时间戳进行分析。 因此,我使用了Linux can/can UTIL中的cansend。在Linux shell上,我可以通过如何将C-printf字符串格式化为与bash printf字符串相等,c,bash,printf,C,Bash,Printf,我想通过CAN接口发送时间戳进行分析。 因此,我使用了Linux can/can UTIL中的cansend。在Linux shell上,我可以通过 cansend can0 123#$(printf“%x”$(日期+%s%N)) date+%s%N为我提供输出1566378641677537(19位)只需使用printf“%X”$(日期+%s%N)转换为十六进制即可B15CE567BA9D338E(即8字节可帧) 然后将其与“cansend”一起发送。在另一边,在我的C代码里面 struct
cansend can0 123#$(printf“%x”$(日期+%s%N))
date+%s%N
为我提供输出1566378641677537
(19位)只需使用printf“%X”$(日期+%s%N)
转换为十六进制即可B15CE567BA9D338E
(即8字节可帧)
然后将其与“cansend”一起发送。在另一边,在我的C代码里面
struct timeval start;
gettimeofday(&start,NULL);
printf(“%.0f%.0f\n”,(双精度)(start.tv\u sec),(双精度)(start.tv\u usec))//用于调试
printf(“%x%.0X.%0X%x\n”),(双精度)(start.tv\u sec),(双精度)(start.tv\u usec))//期望输出
给我输出1566382713648209
(这是16位数字,没有nano,但对我来说足够精确)但是如果我使用
printf(“%x%.0X%0X%x\n”,(double)(start.tv\u sec),(double)(start.tv\u usec))
然后输出为09e400041d757460
。
如何获得所需的输出
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);
}
#包括
#包括
int main(){
struct-timespec-tp;
时钟获取时间(时钟实时,&tp);
无符号长tmp=tp.tv_sec*1000ull*1000*1000+tp.tv_nsec;
printf(“%llX”,tmp);
}
不要使用gettimeofday,它从POSIX 2008开始就被弃用了。只需将其转换为十六进制值,分辨率为纳秒
#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);
}
#包括
#包括
int main(){
struct-timespec-tp;
时钟获取时间(时钟实时,&tp);
无符号长tmp=tp.tv_sec*1000ull*1000*1000+tp.tv_nsec;
printf(“%llX”,tmp);
}
不要使用gettimeofday,它自POSIX 2008以来就被弃用了。为什么要将转换为
double
的值传递给printf()
,并使用格式化字符串%x
和%x
?那些需要无符号int
,因此这是即时的未定义行为。为什么要将转换为double
的值传递给带有格式字符串%x
和%x
的printf()
?那些期望无符号int
,因此这是即时的未定义行为。