Какие основные преобразования необходимы для преобразования данных в системе с прямым порядком байтов в сетевой порядок байтов? Для 2-байтовых и 4-байтовых данных есть хорошо известные функции (такие как htons, ntohl и т. д.) Для инкапсуляции изменений, что происходит со строками 1-байтовых данных (если есть)?
Кроме того, Википедия подразумевает, что прямой порядок байтов является зеркальным отображением обратного порядка байтов, но если бы это было так, зачем нам нужна специальная обработка 2- и 4-байтовых данных?
Эссе «О священных войнах и призыве к миру», кажется, подразумевает, что существует много разных вариантов метода little-endian - это старое эссе - применимо ли это до сих пор? Маркеры порядка байтов, подобные тем, которые находятся в начале файлов классов Java, по-прежнему необходимы?
И наконец, необходимо ли 4-байтовое выравнивание для сетевого порядка байтов?





Допустим, у вас есть текст ASCII «BigE» в массиве байтов b.
b[0] == 'B'
b[1] == 'i'
b[2] == 'g'
b[3] == 'E'
Это также сетевой порядок строки.
Если бы это было 32-битное целое число, это было бы
'B' + ('i' << 8) + ('g' << 16) + ('E' << 24)
на платформе с прямым порядком байтов и
'E' + ('g' << 8) + ('i' << 16) + ('B' << 24)
на платформе с прямым порядком байтов.
Если вы конвертируете каждую 16-битную работу отдельно, вы не получите ни одного из этих
'i' + ('B' << 8) + ('E' << 16) + ('g' << 24)
вот почему требуются оба ntohl и ntohs.
Другими словами, ntohs меняет местами байты в 16-битном коротком, а ntohl меняет порядок четырех байтов своего 32-битного слова.
Конкретные функции обработки 2- и 4-байтовых данных используют тот факт, что существуют инструкции процессора, которые работают с данными определенного размера. Выполнение 1-байтовой функции реверса четыре раза, безусловно, менее эффективно, чем использование более широких инструкций для выполнения одних и тех же (хотя и увеличенных в масштабе) операций над всеми четырьмя байтами одновременно.
1-байтовые данные не требуют преобразования между порядком байтов (это преимущество UTF-8 перед UTF-16 и UTF-32 для строковой кодировки).
is 4-byte alignment necessary for network-byte order?
Для байтов, передаваемых по сети, никакого специального выравнивания не требуется. Вашему процессору может потребоваться определенное выравнивание памяти, но вам решать, как устранить несоответствие. Семейство x86 обычно не предъявляет таких требований.
Основная идея состоит в том, что все многобайтовые типы должны иметь обратный порядок байтов. В случае четырехбайтового целого числа байты 0 и 3 поменялись местами, а байты 1 и 2 поменялись местами. Двухбайтовое целое число поменяет местами байты 0 и 1. Однобайтовые символы не меняются местами.
Есть два следствия очень важный из этого, которые не практикующие и новички не всегда осознают: