从二进制文件中读取32位整数

时间:2015-08-18 07:21:02

标签: c++ file fstream

我的二进制文件看起来像这样。

00000000: 0000 0803 0000 ea60 0000 001c 0000 001c
00000010: 0000 0000 0000 0000 0000 0000 0000 0000

左栏是地址。

我刚刚尝试阅读0000 0803(= 2051),如下所示

ifstream if;
if.open("file");
uint32_t a;
if >> a;

正如所料......它不起作用:-(
执行后a仅为0 我试过了long, int, unsigned int, unsigned long。都失败了。

为什么这些不起作用,我如何实现目标?

2 个答案:

答案 0 :(得分:25)

您有两个问题:

  1. 确保您从流中读取您想要的字节(不少,不多)。

    我推荐这种语法:

    uint32_t a;

    inFILE.read(reinterpret_cast<char *>(&a), sizeof(a));

  2. 确保您使用正确的字节顺序解释这些字节。

    问:如果你在PC上,你的CPU可能是little endian。你知道你的数据流是否也是小端的,还是大端?

    如果数据是big-endian,我会考虑标准网络功能来容纳字节顺序:ntohl()等:http://www.retran.com/beej/htonsman.html

  3. ALSO:

    按照Hcorg和Daniel Jour的建议:不要忘记“开放模式”参数,不要忘记检查“文件打开”错误。

答案 1 :(得分:4)

以二进制模式打开文件,然后使用read()方法,如:

uint32_t a;
ifstream file ("file", ios::in | ios::binary);
if (file.is_open())
{
     file.read ((char*)&a, sizeof(a));
}