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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
622
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Допустим, у вас есть текст 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. Однобайтовые символы не меняются местами.

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

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

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