Какие преобразования используются системами с прямым порядком байтов для преобразования данных в сетевой порядок? - PullRequest
7 голосов
/ 21 января 2009

Какие основные преобразования необходимы для преобразования данных в системе с прямым порядком байтов в сетевой порядок байтов? Для 2-байтовых и 4-байтовых данных есть хорошо известные функции (такие как htons, ntohl и т. Д.) Для инкапсуляции изменений, что происходит со строками из 1-байтовых данных (если они есть)?

Кроме того, Википедия подразумевает, что little-endian является зеркальным отображением big-endian, но если бы это было правдой, зачем нам нужна специальная обработка для 2- и 4-байтовых данных?

Эссе "О священных войнах и призыве к миру", по-видимому, подразумевает, что существует много разных ароматов little-endian - это старое эссе - это все еще применимо? Нужны ли маркеры порядка байтов, подобные тем, которые были найдены в начале файлов классов Java?

И, наконец, необходимо ли 4-байтовое выравнивание для порядка сетевых байтов?

Ответы [ 5 ]

6 голосов
/ 21 января 2009

Допустим, у вас есть текст 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-битного слова.

0 голосов
/ 21 января 2009

Основная идея заключается в том, что все многобайтовые типы должны иметь порядок своих байтов в обратном порядке. Четырехбайтовое целое число поменял бы местами байты 0 и 3, а местами байты 1 и 2. Двухбайтовое целое число будет иметь замененные байты 0 и 1. Однобайтовый символ не поменяется местами.

Существует два очень важных следствия этого, которые не всегда практикующие и неопытные осознают:

  1. (ASCII) Строки символов не затрагиваются.
  2. Существует нет возможных слепых алгоритмов для подстановки байтов общих «данных». Вы должны знать тип всех ваших данных и поменять местами каждый элемент в порядке, необходимом для его типа.
0 голосов
/ 21 января 2009

Требуется ли 4-байтовое выравнивание для порядка сетевых байтов?

Никакого конкретного выравнивания не требуется для байтов, проходящих по сети. Ваш процессор может требовать определенного выравнивания в памяти, но это зависит от вас, чтобы устранить несоответствие. Семейство x86 обычно не предъявляет таких требований.

0 голосов
/ 21 января 2009

1-байтовые данные не требуют преобразования между порядками байтов (это преимущество UTF-8 по сравнению с UTF-16 и UTF-32 для кодирования строк).

0 голосов
/ 21 января 2009

Специальные функции обработки для 2- и 4-байтовых данных используют тот факт, что существуют инструкции процессора, которые работают с определенными размерами данных. Выполнение 1-байтовой функции реверса четыре раза, безусловно, менее эффективно, чем использование более широких инструкций для выполнения одинаковых (хотя и увеличенных в масштабе) операций со всеми четырьмя байтами одновременно.

...