如何使用c ++和C从二进制文件中读取整数

时间:2014-12-24 19:29:37

标签: c++ c

我有一个32位整数的二进制文件,我需要阅读。但是当我使用ifstream.read()(c ++)和fread()(C)时,他们给了我一个完全错误的答案。我认为它正在向后读取整数值。例如,如果我读取位字符串\0\0\0\r(转换为字符),那么当我得到值13时,我得到值218,103,808。这些转换为二进制的值是:

<00> 1101 0000 0000 0000 0000 0000 0000(218,103,808)

<00> 0000 0000 0000 0000 0000 0000 0000 1101(13)

并且转换为二进制的位串应为:

<00> 0000 0000 0000 0000 0000 0000 0000 1101(\0\0\0\r

因为前三个字节是空字符,最后一个字节的ascii值是13

所以首先,如果我说的话是错的,请纠正我,其次,为什么它给出218,103,808而不是13的值?第三,我怎样才能得到13的理想结果?

这里有一些其他有用的信息:

我以前读过的代码行是file.read((char*)&i, 4);,其中i是无符号整数,而文件是ifstream;和fread(&i, 4, 1, file);其中i再次是unsigned int,文件是FILE*

如果我只读取最后一个字节\r,那么我确实得到了正确的值,但我需要能够读取任何int而不仅仅是那些可以容纳1个字节数据的int。

如果我能得到一个,C或c ++的答案,那就太棒了,但我希望得到C和c ++的答案。

提前致谢!

1 个答案:

答案 0 :(得分:0)

该文件以little endian字节顺序写入。您的机器使用大端字节顺序。或相反亦然。显而易见的解决方案是在读写时反转字节顺序。这里有很多问题可以解决这个问题。

您可以考虑更深入地考虑是否应该使用机器字节顺序写入文件,如果确实如此。一种常见的方法是使用网络字节顺序(总是大端)写入文件,然后在读取数据时转换为主机字节顺序(机器字节顺序)。

然后可能再次以网络字节顺序写入文件,并且您的程序刚刚错过了转换为主机字节顺序所需的步骤。

这个程序

#include <stdio.h>
#include <stdint.h>

uint32_t reversed(uint32_t val)
{
    return ((val>>24)&0xff) |
           ((val<<8)&0xff0000) |
           ((val>>8)&0xff00) | 
           ((val<<24)&0xff000000);
}

int main(void)
{
    uint32_t val = 13;
    printf("%d\n", val);
    printf("%d\n", reversed(val));
    return 0;
}

有这个输出:

13
218103808

这些是您问题中的两个值。我相信这会让你相信你有一个简单的字节序逆转。