从C中的bin文件中读取带符号的int会给出错误的结果

从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,

我想从.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,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
  • 所以我的第一个问题是,为什么要按这个顺序阅读?第二个不是30303730?假设我必须读取前两个有符号32位整数,那么哪一个是正确的
  • 更重要的是

  • 第二个数字声明应该存在于bin文件中的其余32位有符号整数。有一些注释描述了这个bin文件,我知道第二个数字应该等于4,或者稍大一点,但在任何情况下,370303030都不是一个非常大的数字
  • 我认为我的转换或读取bin文件的方式有问题

    bin文件应包含:

    编辑:


    <> 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是字符031=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]);