Какие преобразования используются системами с прямым порядком байтов для преобразования данных в сетевой порядок?

StackOverflow https://stackoverflow.com/questions/463416

Вопрос

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

Кроме того, из Википедии подразумевается, что little-endian является зеркальным отображением big-endian, но если бы это было правдой, зачем нам нужна специальная обработка для 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 оба обязательны.

Другими словами, <=> меняет местами байты в 16-битном коде и <=> меняет порядок четырех байтов своего 32-битного слова.

Другие советы

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

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

  

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

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

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

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

<Ол>
  • (ASCII) Строки символов не затрагиваются.
  • Существует нет возможного слепого алгоритма для подстановки байтов общего " data " ;. Вы должны знать тип всех ваших данных и поменять местами каждый элемент в порядке, необходимом для его типа.
  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top