Книга: Разработка приложений в среде Linux. Второе издание
17.5.1. Упорядочение байтов
17.5.1. Упорядочение байтов
Сети TCP/IP, как правило, являются неоднородными; они включают в себя широкий ряд механизмов и архитектур. Одно из основных отличий между архитектурами связано со способом хранения чисел.
Машинные числа составляются из последовательности байтов. Например, целые числа в С обычно представляются 4 байтами (32 битами). Существует довольно много способов хранения этих четырех байтов в памяти компьютера. Архитектуры с обратным порядком байтов сохраняют старший (наиболее значимый) байт в наименьшем аппаратном адресе, остальные следуют в порядке от более значимого к менее значимому. Механизмы с прямым порядком байтов хранят многобайтовые значения в абсолютно противоположном порядке: наименее значимый байт отправляется в наименьший адрес памяти. В других механизмах байты сохраняются в различных порядках.
Так как многобайтовые значения являются частью протокола TCP/IP, то разработчики протоколов позаботились о едином стандарте способа передачи многобайтовых значений через сеть[126]. TCP/IP требует использования обратного порядка байтов для передачи протокольной информации и рекомендует также применять его к данным приложений (хотя попытки зафиксировать формат потока данных приложений не предпринимались)[127]. Упорядочение, которое применяется для многобайтовых значений, передаваемых через сеть, известно как сетевой порядок байтов.
Для преобразования порядка байтов хоста в сетевой порядок байтов используются четыре функции.
#include <netinet/in.h>
unsigned int htonl(unsigned int hostlong);
unsigned short htons(unsigned short hostshort);
unsigned int ntohl(unsigned int netlong);
unsigned short ntohs(unsigned short netshort);
Несмотря на то что прототип каждой из этих функций принимает значение без знака, все они отлично работают и для значений со знаком.
Первые две функции htonl()
и htons()
преобразуют длинные и короткие числа соответственно из порядка байтов хоста в сетевой порядок байтов. Последние две ntohl()
и ntohs()
выполняют обратные преобразования длинных и коротких чисел (из сетевого порядка в порядок хоста).
Хотя мы использовали термин длинный в описаниях, на самом деле, это неправильно. Обе функции htonl()
и ntohl()
принимают 32-битные значения, а не те, которые относятся к типу long
. В прототипах обеих функций предполагалось, что они обрабатывают значения int
, поскольку все платформы Linux в настоящее время используют 32-битные целые числа.
- Класс FileStream и байтовый ввод-вывод в файл
- 3.5. Пример: упорядочение по алфавиту
- Порядок байтов на компьютере и в сети
- Порядок следования байтов
- Порядок байтов в ядре
- ДВУХБАЙТОВЫЕ КОДИРОВКИ
- Преждевременное упорядочение
- ОДНОБАЙТОВЫС КОДИРОВКИ
- 2.6. Побайтовая обработка
- 20.3.1. Unix-файл представляет собой только большой блок байтов
- 3.4. Функции определения порядка байтов
- 5.20. Определение порядка байтов