a) Вам нужно беспокоиться только об «порядке байтов» (т. Е. При обмене байтами), если данные были созданы на машине с прямым порядком байтов и обрабатываются на машине с прямым порядком байтов, или наоборот. Есть много способов, которыми это может произойти, но вот пара примеров.
- Вы получаете данные на компьютере Windows через сокет. В Windows используется архитектура с прямым порядком байтов, в то время как сетевые данные «должны» иметь формат с прямым порядком байтов.
- Вы обрабатываете файл данных, который был создан в системе с другим порядком байтов.
В любом из этих случаев вам нужно будет поменять местами все числа, которые больше 1 байта, например, шорты, целые, длинные, двойные и т. Д. Однако, если вы всегда имеете дело с данными из одного и того же платформа, порядковые номера не имеют значения.
b) Исходя из вашего вопроса, звучит так, будто у вас есть указатель на символ и вы хотите извлечь первые 4 байта в виде целого числа, а затем решить любые проблемы с порядком байтов. Чтобы сделать извлечение, используйте это:
int n = *(reinterpret_cast<int *>(myArray)); // where myArray is your data
Очевидно, это предполагает, что myArray не является нулевым указателем; в противном случае произойдет сбой, так как он разыменует указатель, поэтому используйте хорошую схему защитного программирования.
Чтобы поменять местами байты в Windows, вы можете использовать функции ntohs () / ntohl () и / или htons () / htonl (), определенные в winsock2.h. Или вы можете написать несколько простых процедур для этого в 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));
}