从 C++ 中的二进制文件中读取 32 位整数?
Read 32-bit integer from binary file in C++?
我的二进制文件是这样的。
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
。都失败了。
为什么这些都不起作用,我该如何实现目标?
您有两个问题:
确保您从流中读取您想要的字节(不多也不少)。
我推荐这种语法:
uint32_t a;
inFILE.read(reinterpret_cast<char *>(&a), sizeof(a));
确保您以正确的字节顺序解释这些字节。
问:如果您使用的是 PC,您的 CPU 可能是 little endian。你知道你的数据流是小端还是大端吗?
如果数据是大端,我会考虑标准网络函数来适应字节顺序:ntohl()
,等等:http://www.retran.com/beej/htonsman.html
另外:
遵循 Hcorg 和 Daniel Jour 的建议:不要忘记 "open mode" 参数,也不要忘记检查 "file open" 错误。
以二进制模式打开文件,然后使用read()
方法,类似于:
uint32_t a;
ifstream file ("file", ios::in | ios::binary);
if (file.is_open())
{
file.read ((char*)&a, sizeof(a));
}
我的二进制文件是这样的。
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
。都失败了。
为什么这些都不起作用,我该如何实现目标?
您有两个问题:
确保您从流中读取您想要的字节(不多也不少)。
我推荐这种语法:
uint32_t a;
inFILE.read(reinterpret_cast<char *>(&a), sizeof(a));
确保您以正确的字节顺序解释这些字节。
问:如果您使用的是 PC,您的 CPU 可能是 little endian。你知道你的数据流是小端还是大端吗?
如果数据是大端,我会考虑标准网络函数来适应字节顺序:
ntohl()
,等等:http://www.retran.com/beej/htonsman.html
另外:
遵循 Hcorg 和 Daniel Jour 的建议:不要忘记 "open mode" 参数,也不要忘记检查 "file open" 错误。
以二进制模式打开文件,然后使用read()
方法,类似于:
uint32_t a;
ifstream file ("file", ios::in | ios::binary);
if (file.is_open())
{
file.read ((char*)&a, sizeof(a));
}