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-битные целые числа.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

20.3.1. Unix-файл представляет собой только большой блок байтов

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

20.3.1. Unix-файл представляет собой только большой блок байтов Любой файл в Unix представляет собой только большой блок байтов без каких-либо других атрибутов. В частности, не существует возможности сохранять за пределами данных файла информацию о его типе или указатель на


Сколько байтов адресуют 64 разряда

Из книги Основы AS/400 автора Солтис Фрэнк

Сколько байтов адресуют 64 разряда Ответ: 16 экзабайтов, что равно примерно 18,4 квинтиллионам байтов (или точнее 18 446 744 073 709 551 616 байтов).Большинство людей не в состоянии представить себе такое число. Как я уже упоминал, число байтов, которые могут быть адресованы с помощью 48


20.3.1. Unix-файл представляет собой только большой блок байтов

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

20.3.1. Unix-файл представляет собой только большой блок байтов Любой файл в Unix представляет собой только большой блок байтов без каких-либо других атрибутов. В частности, не существует возможности сохранять за пределами данных файла информацию о его типе или указатель на


4.2.5. Упорядочение строк

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл


§ 84. Сколько байтов в килобайте?

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

§ 84. Сколько байтов в килобайте? Алиса. Меня зовут Алиса? Шалтай-Болтай. Какое глупое имя! Что оно значит? Алиса. Разве имя должно что-то значить? Шалтай-Болтай. Конечно, должно! Возьмем, к примеру, мое имя — оно выражает мою суть! Замечательную чудесную суть! А с таким именем,


Упорядочение и группирование строк

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Упорядочение и группирование строк Определение просмотра не может быть упорядоченным. Добавление предложения ORDER BY вызывает исключение. Следовательно, не имеет смысла использовать в операторе SELECT ключевых слов FIRST и/или SKIP, поскольку они оперируют с упорядоченными


Порядок следования байтов

Из книги QT 4: программирование GUI на С++ автора Бланшет Жасмин

Порядок следования байтов Порядок следования байтов (byte ordering) — это порядок, согласно которому байты расположены в машинном слове. Для разных процессоров может использоваться один из двух типов нумерации байтов в машинном слове: наименее значимый (самый младший) байт


Порядок байтов в ядре

Из книги автора

Порядок байтов в ядре Для каждой аппаратной платформы, которая поддерживается ядром Linux, в файле <asm/byteorder.h> определена одна из двух констант __BIG_ENDIAN или __LITTLE_ENDIAN, в соответствии с используемым порядком байтов.В этот заголовочный файл также включаются макросы из