从C中的bin文件中读取带符号的int会给出错误的结果
我想从.bin文件中读取数据。实际上,如果我预览bin文件的数据,我会看到如下内容:从C中的bin文件中读取带符号的int会给出错误的结果,c,numbers,hex,fread,bin,C,Numbers,Hex,Fread,Bin,我想从.bin文件中读取数据。实际上,如果我预览bin文件的数据,我会看到如下内容: 0000000 3030 3030 3030 3730 300a 3030 3030 3030 0000010 0a35 3330 3030 3030 3030 300a 3031 3030 因此,我只想首先读取前232位带符号int 我的代码是: int data,data2; fread(&data,
0000000 3030 3030 3030 3730 300a 3030 3030 3030
0000010 0a35 3330 3030 3030 3030 300a 3031 3030
因此,我只想首先读取前232位带符号int
我的代码是:
int data,data2;
fread(&data,4,1, ptr_myfile);
printf("First Data read in hex is: %x\n",data);
/*read the second 32 bit integer*/
fread(&data2,sizeof(int),1, ptr_myfile);
printf("Second data read in hex is: %x\n",data2);
我的输出是:
First Data read in hex is: 30303030
Second data read in hex is: 37303030
<> P>请问我在这里缺少什么? < P>当比较原始格式的多字节二进制文件时,你可能需要考虑。至少在阅读和打印后显示数字时,当数字的字节显示为“反向”时,我首先想到的是这一点。很可能是亨里克所说的,而使用printf会给水体增加额外的浑浊 试试这个:
unsigned char data[4],data2[4];
fread(&data,4,1, ptr_myfile);
printf("First Data read in hex is: %x, %x, %x, %x\n",data[0], data[1], data[2], data[3]);
/*read the second 32 bit integer*/
fread(&data2,4,1, ptr_myfile);
printf("Second data read in hex is: %x, %x, %x, %x\n",data2[0], data2[1], data2[2], data2[3]);
这将在读取字节时为您提供字节,而不会因相关性问题而出现任何字节切换。这看起来确实像是编码问题 该文件似乎包含简单的ASCII数字值——至少从您给我们的示例来看是这样 ASCII十六进制代码
30
是字符0
,31
=1
,…,39
=9
。
ASCII十六进制代码0A
是换行符
如果您也发现了这些值,我不会太惊讶
41
直到46
这将解析为A
-F
,或者可能61
直到66
这将是小写变体A
-F
由于该描述声称这些数字的宽度为32位,我建议您尝试读取每个数字最多8个字符(字节),并通过使用sscanf
,将这些ASCII值转换为数值-如上所述,数字很可能由该换行符分隔
然而,令人困惑的是,您给定的示例包含的数字显然是由超过8个字符组成的
35 3330 3030 3030 3030 30
这将决定
5300 0000 00
宽度超过32位,因此不符合说明
所以有些地方出了问题,要么是描述(应该是64位),要么是你的引用(你在复制时不知怎么搞混了),要么是整个文件格式都坏了(不太可能)
首先,我会逐行解析它们,并尝试使用
sscanf
monster将它们转换为二进制值。是的,在我看来也像小endian。看起来您有一台使用小端点或小端点优先的机器。只要您的数据在具有相同尾数的机器上写入和读取,这就不会引起问题。您确定这实际上是二进制的而不是ASCII的吗?30h=0
,37h=7
,35h=5
,0Ah=linefeed
@谢谢,是的,它实际上是ASCII码。因此,如果我必须读取第一个32位有符号整数,我应该一直读取到第一个换行符还是应该读取多少ascii字符?@直到是,就是这样。如果你能回答,我可以接受,因为那是我的主要问题,而不是持久性。问题是什么?在我看来这是完全正确的。。。
unsigned char data[4],data2[4];
fread(&data,4,1, ptr_myfile);
printf("First Data read in hex is: %x, %x, %x, %x\n",data[0], data[1], data[2], data[3]);
/*read the second 32 bit integer*/
fread(&data2,4,1, ptr_myfile);
printf("Second data read in hex is: %x, %x, %x, %x\n",data2[0], data2[1], data2[2], data2[3]);