Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将C-printf字符串格式化为与bash printf字符串相等_C_Bash_Printf - Fatal编程技术网

如何将C-printf字符串格式化为与bash printf字符串相等

如何将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

我想通过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 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
,因此这是即时的未定义行为。