1

私は現在、エンディアン関連の問題に取り組んでいます。

ビッグエンディアンシステムにビッグエンディアンファイルがあると仮定しましょう。

このファイルの最初の値2882400152 = 0xABCDEF98は、整数4です。

その値を整数4、、で読み取るには、次の_myint4ようにします。

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

問題は、ファイル内の整数4の値を整数8で読み取ることに相当するものは何_myint8ですか?

  • ビッグエンディアンのファイルとシステムの場合は?
  • リトルエンディアンのファイルとシステムの場合は?

私の最初の推測はそのようなものになるでしょう:

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

しかし、私にはまったくわかりません。これを行うための良い方法は何ですか?

重要:一時的な整数4の値は使用できません。で、整数4を直接読み取る必要があります_myint8

4

1 に答える 1

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'

つまり、あなたは正しいです。オーバーライドしていないメモリ内の場所にゼロがあることを確認する必要があります。

于 2012-09-29T04:18:54.460 に答える