C 如何打印二进制文件的真实内容

C 如何打印二进制文件的真实内容,c,binary,printf,fwrite,fread,C,Binary,Printf,Fwrite,Fread,我使用下面的代码来测试读取二进制文件,bin_data_文件中的内容如下所示,有512字节。我的问题是,为什么输出有奇怪的内容,比如使用“printf(“buf是%02x\n”,buf[i])”的fffffff8c?如何打印buf的真实内容 bin_数据_文件: 0000000 0403 0007 0000 4000 0440 0670 0a8c 0000 0000010 0003 0a00 4946 494e 4153 2052 4f43 5052 0000020 202e 2020 0000

我使用下面的代码来测试读取二进制文件,bin_data_文件中的内容如下所示,有512字节。我的问题是,为什么输出有奇怪的内容,比如使用“printf(“buf是%02x\n”,buf[i])”的fffffff8c?如何打印buf的真实内容

bin_数据_文件:

0000000 0403 0007 0000 4000 0440 0670 0a8c 0000
0000010 0003 0a00 4946 494e 4153 2052 4f43 5052
0000020 202e 2020 0000 6590 5446 464c 3538 3932
0000030 3350 4e42 2d56 3545 3141 2020 5203 a900
0000040 3a00 0000 5155 3036 3030 2048 2020 2020
0000050 2020 2020 3331 3830 3430 2020 fa68 e505
0000060 0000 0000 0000 0000 0000 0000 0000 0000
*
0000100 005d 00f6 005c 00f8 8890 546f a08c 3c73
0000110 7017 f401 7616 e803 1027 eb04 071f 3106
0000120 e93d c800 2d31 3c01 0000 0000 0000 0000
0000130 0000 0000 0000 0000 0000 0000 0000 0000
0000140 0000 0000 803f 0000 0000 0000 0001 0000
0000150 0001 0000 0001 0000 0001 0000 0000 1f00
0000160 061e 9c81 d70f bf1a 2822 0000 0000 0030
0000170 0000 0000 0000 0000 ffff ffff ffff 01ff
0000180 0040 0078 0b78 3130 2d39 3730 2d38 3430
0000190 0335 3041 0f31 3030 3030 3030 3030 3030
00001a0 3030 3030 0030 0000 0000 0000 0000 0000
00001b0 0000 0000 0000 0000 0000 0000 0000 0000
*
00001f0 0000 0000 6d67 5853 0000 0000 0000 451a
0000200

    //read bin file
   FILE *fp_read = fopen("bin_data_file", "rb");
   if (fp_read == NULL)
     printf("failed to open file.");

   char *buf = malloc(512);
   memset(buf, 0 , 512);
   int ret = fread(buf, 1, 512, fp_read);
   for(i = 0; i<512;i++) {
     printf("buf is %02x\n", buf[i]); //has issue??
   }
   fclose(fp_read);
问题在于转换。更具体地说,在调用变量参数函数(如
printf
)时生成的

发生的情况是,小于
int
的类型的值将被设置为
int
。对于有符号类型(可能是
char
),编译器将进行符号扩展,因此负值保持为负值

您看到的是系统上发生的这种转换的结果


要防止这种情况发生,请改用显式的
无符号
类型,如
uint8\u t

不确定输出是否与代码匹配您必须使用
无符号字符*buf=malloc(512)更改为无符号整数
如果一个字节大于0x7F,则该值将被解释为带负数符号,printf()函数将负十六进制值打印为0xfffff8c,即-116(十进制)。此处不需要动态分配,请使用普通数组作为缓冲区。关于:
如果(fp_read==NULL)printf(“无法打开文件”)1)错误消息应输出到
stderr
,而不是
stdout
。2) 发生此错误时,代码不应继续,就好像调用
fopen()
成功一样。当调用
fopen()
失败时,调用
fclose()
将导致seg故障事件。建议:
如果(fp_read==NULL){perror(“无法打开文件”);退出(exit_FAILURE)}
调用任何堆分配函数时:
malloc
calloc
realloc
,请始终检查(!=NULL)返回值以确保操作正确successful@Ctx:C99中添加了%hh和%ll长度修饰符(见§7.19.6.2)。@TomKuschel是的,但事实上存在的时间要长得多,有很多流行音乐compilers@TomKuschel是的,C17和2018年已经过时。因此最好使用无符号字符而不是字符,并且不要使用%02hhx来打印buf?@winnie的内容,而是
uint8\t
,因为您拥有的数据不是真正的字符(即使它很可能仍然被定义为
无符号字符
)。
uint8\u t
告诉代码读者这只是一些任意的8位无符号数据。
03 04 07 00 00 00 00 40 40 04 70 06 ffffff8c 0a 00 00 03 00 00 0a 46 49 4e 49 53 41 52 20 43 4f 52 50 2e 20 20 20 00 00 ffffff90 65 46 54 4c 46 38 35 32 39 50 33 42 4e 56 2d 45 35 41 31 20 20 03 52 00 ffffffa9 00 3a 00 00 55 51 36 30 30 30 48 20 20 20 20 20 20 20 20 20 31 33 30 38 30 34 20 20 68 fffffffa 05 ffffffe5 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5d 00 fffffff6 00 5c 00 fffffff8 00 ffffff90 ffffff88 6f 54 ffffff8c ffffffa0 73 3c 17 70 01 fffffff4 16 76 03 ffffffe8 27 10 04 ffffffeb 1f 07 06 31 3d ffffffe9 00 ffffffc8 31 2d 01 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3f ffffff80 00 00 00 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 1f 1e 06 ffffff81 ffffff9c 0f ffffffd7 1a ffffffbf 22 28 00 00 00 00 30 00 00 00 00 00 00 00 00 00 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 01 40 00 78 00 78 0b 30 31 39 2d 30 37 38 2d 30 34 35 03 41 30 31 0f 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 67 6d 53 58 00 00 00 00 00 00 1a 45