Двоичное чтение, reinterpret_cast и порядковый номер

В настоящее время я занимаюсь проблемами, связанными с порядком байтов.

Давайте предположим, что у меня есть файл с прямым порядком байтов в системе с прямым порядком байтов.

Первое значение в этом файле 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,

0

Решение

Ваше предположение кажется правильным:

_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'

Так что вы правы, вам просто нужно убедиться, что у вас есть нули в тех местах памяти, которые вы не переопределяете.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]