
Предположим, что A — это машина BE, которая отправляет 0x44332211, отправляя данные в B, которая является LE. По умолчанию A будет использовать htonl 0x44332211, который представляет собой не что иное, как 0x44332211.
Теперь, когда 0x44332211 достигает B, B знает, что это формат BE, поэтому B перевернет его с помощью функции htonl и изменит его на 0x11223344.
Что означает этот флиппинг? Я прочитал эту концепцию в интернете. Почему флиппинг необходим перед хранением?
Потому что в этом случае перевернутое значение 0x11223344 будет сохранено в LE как 0x44332211, что отличается от того, что отправляет A, потому что B интерпретирует его по-разному, хотя они выглядят одинаково?
/* Преобразование из BE в LE */
решение1
Функции htonl()
и ntohl()
в библиотеке C с обратным порядком байтов на самом деле ничего не делают (они являются "пустыми операциями"). Таким образом, один и тот же код может использоваться как на машинах BE, так и на машинах LE; скомпилированные с помощью библиотеки C на машине LE, эти функции перевернут байты, но на машине BE они оставят их прежними, поскольку сетевой порядок байтов — обратный, а хост уже имеет обратный порядок байтов.
Другими словами, в вашем примере BE машина A никогда ничего не меняет. Это делает только LE машина B.
решение2
На самом деле, переворачивание не требуется перед сохранением каким-либо определенным образом. Оно требуется, поскольку хост использует порядок little endian, поэтому, когда он получает от сети число длиннее одного байта, он переворачивает байты, чтобы правильно интерпретировать это число. Необходимо выполнить это переворачивание перед тем, как данные будут использованы для какой бы то ни было цели.
В качестве аналогии представьте, что вы читаете мангу, напечатанную в оригинальном японском стиле (то есть страница, которая обычно является последней, на самом деле является первой). Если вы не осознаете этого факта и не «переворачиваете» книгу, вы просто не сможете понять историю.