Порядок байт | это... Что такое Порядок байт? (original) (raw)
Поря́док ба́йтов в информатике — метод записи байтов многобайтовых чисел.
В общем случае, когда нужно компактно записать число, большее 255 (28 − 1 = 255 — максимальное целое число, записываемое одним байтом (октетом)) необходимо использовать несколько байтов. Число M факторизуется по основанию 256:
Набор чисел и является последовательностью байтов для записи.
Содержание
- 1 Варианты записи
- 2 Проблемы совместимости
- 3 Определение порядка байтов
- 4 Конвертация
- 5 Интересные факты
- 6 См. также
- 7 Ссылки
Варианты записи
Порядок от младшего к старшему
Порядок от младшего к старшему или «остроконечный» (англ. little-endian, о происхождении термина ниже): , запись начинается с младшего и заканчивается старшим. Этот порядок записи принят в памяти персональных компьютеров с интеловский порядок байтов (по названию фирмы-создателя архитектуры x86).
Порядок от старшего к младшему
Порядок от старшего к младшему или «тупоконечный» (англ. big-endian): , запись начинается со старшего и заканчивается младшим. Этот порядок является стандартным для протоколов TCP/IP, он используется в заголовках пакетов данных и во многих протоколах более высокого уровня, разработанных для использования поверх TCP/IP. Поэтому, порядок байтов от старшего к младшему часто называют сетевым порядком байтов (англ. network byte order). Этот порядок байтов используется процессорами IBM 360/370/390, Motorola 68000, порядок байтов Motorola, Motorola byte order).
В этом же виде (но с факторизацией по основанию 10) записываются числа индийско-арабскими цифрами.
Порядок байтов от старшего к младшему применяется в многих форматах файлов — например, PNG.
Переключаемый порядок
Многие процессоры могут работать и в порядке от младшего к старшему, и в обратном, например, PowerPC (но не PowerPC 970), DEC Alpha, MIPS, IA-64. Обычно порядок байтов выбирается программно во время инициализации операционной системы, но может быть выбран и аппаратно перемычками на материнской плате. В этом случае правильнее говорить о порядке байтов операционной системы. Переключаемый порядок байтов иногда называют англ. bi-endian.
Смешанный порядок
Смешанный порядок байтов (англ. middle-endian) иногда используется при работе с числами, длина которых превышает машинное слово. Производится факторизация числа на машинные слова, которые записываются в формате, естественном для данной архитектуры, но сами слова записываются в обратном порядке.
Классический пример middle-endian — представление 4-байтных целых чисел на 16-битных процессорах семейства
В процессорах ARM используется смешанное представление для длинных вещественных чисел.
Пример
Далее приведён пример, в котором описывается размещение 4-байтового числа в ОЗУ ЭВМ, доступ к которому может производиться как к 32-разрядному слову, так и побайтно.
Все числа записаны в 16-тиричной системе счисления.
Число: 0xA1B2C3D4
Факторизация : D40x01 + C30x100 + B20x10000 + A10x1000000
Порядок от младшего к старшему (little-endian) : 0xD4, 0xC3, 0xB2, 0xA1
Порядок от старшего к младшему (big-endian) : 0xA1, 0xB2, 0xC3, 0xD4
Порядок, принятый в PDP-11 (PDP-endian) : 0xB2, 0xA1, 0xD4, 0xC3
Сравнение
Размещение байтов слова в памяти Big-endian и Little-endian ЭВМ
Существенным достоинством little-endian по сравнению с big-endian порядком записи считается возможность «неявной типизации» целых чисел при чтении меньшего объёма байт (при условии, что читаемое число помещается в диапазон). Так, если в ячейке памяти содержится число 0x00000022, то прочитав его как int16 (два байта) мы получим число 0x0022, прочитав один байт — число 0x22.
Обратно, считается что у little-endian, по сравнению с big-endian есть «неочевидность» значения байтов памяти при отладке (последовательность байтов (33, 44, 55, 12) на самом деле значит 0x12554433, для big-endian эта последовательность (33, 44, 55, 12) читалась бы «естественным» для арабской записи чисел образом: 0x33445512). Наименее удобным в работе считается middle-endian формат записи; он сохранился только на старых платформах.
Для записи длинных чисел (чисел, длина которых существенно превышает разрядность машины) обычно предпочтительнее порядок слов в числе little-endian (поскольку арифметические операции над длинными числами производятся от младших разрядов к старшим). Порядок байтов в слове — обычный для данной архитектуры.
Проблемы совместимости
Запись многобайтового числа из памяти компьютера в файл или передача по сети требует соблюдения соглашений о том, какой из байтов является старшим, а какой младшим. Прямая запись ячеек памяти приводит к возможным проблемам при переносе приложения с платформы на платформу.
Определение порядка байтов
Порядок байтов в конкретной машине можно определить с помощью программы на языке Си (testendian.c):
#include <stdio.h> unsigned short x = 1; /* 0x0001 */ int main(void) { printf("%s\n", *((unsigned char *) &x) == 0 ? "big-endian" : "little-endian"); return 0; }
Вывод данной программы осмыслен только на платформах, где размер типа unsigned short больше, чем размер типа unsigned char. Это заведомо верно на подавляющем большинстве компьютеров, так как они имеют 8-разрядный байт. Однако существуют и аппаратные платформы с 32-разрядным байтом.
Результаты запуска на big-endian машине (
Результаты запуска на little-endian машине (
****## Конвертация**
Для преобразования между сетевым порядком байтов (англ. network byte order), который всегда big-endian, и порядком байтов, использующимся на машине (англ. host byte order), стандарт htonl(), htons(), ntohl(), ntohs():
## Интересные факты
*** Термины big-endian и little-endian первоначально не имели отношения к информатике. В сатирическом произведении Джонатана Свифта «Путешествия Гулливера» описываются вымышленные государства Лилипутия и Блефуску, в течение многих лет ведущие между собой войны из-за разногласия по поводу того, с какого конца следует разбивать варёные яйца. Тех, кто считает, что их нужно разбивать с тупого конца, в произведении называют «Big-endians» («тупоконечники»). Споры между сторонниками big-endian и little-endian в информатике также часто носят характер «религиозных войн».**
## См. также
*** Компьютерная сеть**
## Ссылки
*** Сетевой порядок байтов, функции htons(), htonl(), ntohs(), ntohl()** *** Порядок байтов** *** Порядок байтов** *** http://www.rdrop.com/~cary/html/endian_faq.html (англ.)**
****Wikimedia Foundation.2010.**