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

plh*_*lhn 14 c++ fstream file

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

00000000: 0000 0803 0000 ea60 0000 001c 0000 001c
00000010: 0000 0000 0000 0000 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

左栏是地址.

我只是尝试阅读0000 0803(= 2051)如下

ifstream if;
if.open("file");
uint32_t a;
if >> a;
Run Code Online (Sandbox Code Playgroud)

正如预期的那样......它不起作用:-(
a执行后只是0.
我试过long, int, unsigned int, unsigned long.都失败了.

为什么这些不起作用,我怎样才能实现目标?

pau*_*sm4 27

你有两个问题:

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

    我推荐这种语法:

    uint32_t a;

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

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

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

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

也:

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

  • 为什么不"工作"?这是一个记录在案的行为? (3认同)

Vol*_*And 5

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

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

  • 我只是试图编译你的代码片段。还有我上面打印的错误。 (2认同)
  • 我含蓄地谈论它。 (2认同)