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

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

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

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

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

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

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

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