Чтение байтов "целого" размера из массива char *.

a) Вам нужно беспокоиться c только о "порядке байтов" (т. е. об c++ обмене байтами), если данные endianness были созданы на машине с c прямым порядком байтов и c++ обрабатываются на машине cpp с прямым порядком байтов, или cpp наоборот. Это может произойти endianness разными способами, но вот c++ несколько примеров.

  1. Вы получаете данные на машине Windows через сокет. В Windows используется архитектура с прямым порядком байтов, в то время как сетевые данные «предполагаются» в формате с прямым порядком байтов.
  2. Вы обрабатываете файл данных, созданный в системе с другим порядком байтов.

В любом big-endian из этих случаев вам необходимо byte-order поменять местами все числа, размер cxx которых превышает 1 байт, например, короткие, целые, длинные, двойные endianness и т. д. Однако, если вы всегда byte-order имеете дело с данными из byte-order одного и того же платформы, проблемы endianness с порядком байтов не вызывают byte-order беспокойства.

б) Исходя из cpp вашего вопроса, похоже, что endianness у вас есть указатель char endian и вы хотите извлечь первые little-endian 4 байта как int, а затем big-endian решить любые проблемы с порядком endian байтов. Для извлечения используйте little-endian это:

int n = *(reinterpret_cast(myArray)); // where myArray is your data

Очевидно, это предполагает, что cxx myArray не является нулевым big-endian указателем; в противном случае cxx произойдет сбой, поскольку cpp указатель разыменуется, поэтому cxx используйте хорошую схему big-endian защитного программирования.

Чтобы c++ поменять местами байты в cpp Windows, вы можете использовать cxx функции ntohs() / ntohl() и endianness / или htons() / htonl(), определенные cpp в winsock2.h. Или вы можете little-endian написать несколько простых cpp подпрограмм на C++, например:

inline unsigned short swap_16bit(unsigned short us)
{
    return (unsigned short)(((us & 0xFF00) >> 8) |
                            ((us & 0x00FF) << 8));
}

inline unsigned long swap_32bit(unsigned long ul)
{
    return (unsigned long)(((ul & 0xFF000000) >> 24) |
                           ((ul & 0x00FF0000) >>  8) |
                           ((ul & 0x0000FF00) <<  8) |
                           ((ul & 0x000000FF) << 24));
}

c++

c

endianness

2022-08-28T12:12:19+00:00
Вопросы с похожей тематикой, как у вопроса:

Чтение байтов "целого" размера из массива char *.