二进制读取,reinterpret_cast和endianness

时间:2012-09-29 00:17:30

标签: c++ binaryfiles endianness reinterpret-cast

我目前正在处理与字数相关的问题。

我们假设我在big-endian系统中有一个big-endian文件。

此文件中的第一个值是2882400152 = 0xABCDEF98,它是一个整数4。

要读取整数4 _myint4中的该值,我只需执行:

mystream.read(reinterpret_cast<char*>(&_myint4), sizeof(_myint4))

问题是:相当于读取文件中的整数4值,整数为8,_myint8

  • 是否为big-endian文件和系统?
  • for little-endian文件和系统?

我的第一个猜测是这样的:

mystream.read((reinterpret_cast<char*>(&_myint8))+4, 4); // big-endian file/system
mystream.read(reinterpret_cast<char*>(&_myint8), 4); // little-endian file/system

但我完全不确定。这样做的好方法是什么?

重要提示:我不能使用临时整数4值,我需要直接读取_myint8中的整数4。

1 个答案:

答案 0 :(得分:1)

您的猜测似乎正确:

_myint8 = 0;
mystream.read((reinterpret_cast<char*>(&_myint8))+4, 4); // big-endian file/system
mystream.read(reinterpret_cast<char*>(&_myint8), 4); // little-endian file/system

要自己计算字节顺序,可能有助于在Python中发挥作用:

>>> import struct
>>> struct.pack(">Q", 0xabcdef98)    // Big-endian 8-byte int.
'\x00\x00\x00\x00\xab\xcd\xef\x98'   // Its layout in memory.
>>> struct.pack(">I", 0xabcdef98)    // Big-endian 4-byte int.
'\xab\xcd\xef\x98'

>>> struct.pack("<Q", 0xabcdef98)    // Little-endian 8-byte int.
'\x98\xef\xcd\xab\x00\x00\x00\x00'
>>> struct.pack("<I", 0xabcdef98)    // Little-endian 4-byte int.
'\x98\xef\xcd\xab'

所以你是对的,你只需要确保你在内存中没有覆盖的地方有零。