Какие преобразования используются системами с прямым порядком байтов для преобразования данных в сетевой порядок?
-
19-08-2019 - |
Вопрос
Какие основные преобразования необходимы для преобразования данных в системе с прямым порядком байтов в сетевой порядок байтов? Для 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. Однобайтовый символ не поменяется местами.
Есть два очень важных значения, которые не всегда практикующие и начинающие не осознают:
<Ол>