Порядок байтов - Endianness

В вычислений , порядок байт это порядок или последовательность байтов одного слова цифровых данных в памяти компьютера . Порядок байтов в первую очередь выражается прямым порядком байтов ( BE ) или прямым порядком байтов ( LE ). В системе с прямым порядком байтов старший байт слова хранится по наименьшему адресу памяти, а младший байт - по наибольшему. В отличие от этого, в системе с прямым порядком байтов младший байт хранится по наименьшему адресу.

Порядок байтов может также использоваться для описания порядка, в котором биты передаются по каналу связи, например, обратный порядок байтов в канале связи сначала передает наиболее значимые биты. Битовый порядок байтов редко используется в других контекстах.

Компьютеры хранят информацию в группах двоичных разрядов разного размера. Каждой группе присваивается номер, называемый ее адресом , который компьютер использует для доступа к этим данным. На большинстве современных компьютеров самая маленькая группа данных с адресом имеет длину восемь бит и называется байтом. Группы большего размера содержат два или более байта, например, 32-битное слово содержит четыре байта. Есть два возможных способа пронумеровать отдельные байты в большей группе, начиная с обоих концов. Оба типа байтов широко используются в цифровой электронной технике. Первоначальный выбор порядка байтов для нового дизайна часто бывает произвольным, но более поздние технологические изменения и обновления сохраняют существующий порядок байтов для сохранения обратной совместимости .

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

Порядок с прямым порядком байтов является преобладающим в сетевых протоколах, например, в наборе интернет-протоколов , где он называется сетевым порядком , когда первым передается наиболее значимый байт. И наоборот, порядок байтов с прямым порядком байтов является преобладающим для архитектур процессоров ( x86 , большинство реализаций ARM , базовые реализации RISC-V ) и связанной с ними памяти. Форматы файлов могут использовать любой порядок; в некоторых форматах используется сочетание обоих или содержится индикатор того, какой порядок используется во всем файле.

Стили с прямым и обратным порядком байтов могут также использоваться в более общем плане для характеристики порядка любого представления, например цифр в системе счисления или частей даты . Числа в позиционной системе счисления обычно записываются цифрами в прямом порядке, даже в сценариях с письмом справа налево . Точно так же языки программирования используют порядок чисел с прямым порядком байтов для числовых литералов .

Пример

Пример порядка байтов
С прямым порядком байтов
Little-endian

Эти две диаграммы показывают, как два компьютера, использующие разный порядок байтов, хранят 32-битное (четырехбайтовое) целое число со значением 0x0A0B0C0D . В обоих случаях целое число разбивается на четыре байта, 0x0A , 0x0B , 0x0C и 0x0D , и байты сохраняются в четырех последовательных байтовых ячейках в памяти, начиная с ячейки памяти с адресом a , затем a + 1 , a + 2 и а + 3 . Разница между старшим и младшим порядком байтов заключается в порядке сохранения четырех байтов целого числа.

На левой диаграмме показан компьютер с прямым порядком байтов. При этом начинается сохранение целого числа с наиболее значимым байтом 0x0A по адресу a и заканчивается наименьшим байтом 0x0D по адресу a + 3 .

На правой диаграмме показан компьютер с прямым порядком байтов. Это начинает сохранение целого числа с наименьшим значащим байтом, 0x0D , по адресу a , и заканчивается самым значимым байтом, 0x0A , по адресу a + 3 .

Поскольку каждый компьютер использует одинаковую последовательность байтов для хранения и извлечения целого числа, результаты будут одинаковыми для обоих компьютеров. Проблемы могут возникнуть, когда память адресуется байтами, а не целыми числами, или когда содержимое памяти передается между компьютерами с разным порядком байтов.

Этимология

Дэнни Коэн ввел в информатику термины с прямым порядком байтов и прямым порядком байтов для упорядочения данных в заметке об эксперименте в Интернете, опубликованной в 1980 году.

Прилагательное endian возникло в трудах англо-ирландского писателя 18 века Джонатана Свифта . В романе «Путешествия Гулливера» 1726 года он изображает конфликт между сектами лилипутов, разделенных на те, кто ломает скорлупу вареного яйца с большого конца или с маленького конца. Он назвал их Big-Endians и Little-Endians . Коэн явно указывает связь с « Путешествиями Гулливера» в приложении к своей заметке 1980 года.

Основы

Компьютерная память состоит из последовательности ячеек памяти (наименьших адресуемых единиц), обычно называемых байтами . Каждый байт идентифицируется и доступен в аппаратном и программном обеспечении по его адресу памяти . Если общее количество байтов в памяти равно n , то адреса нумеруются от 0 до n  - 1.

Компьютерные программы часто используют структуры данных или поля, которые могут состоять из большего количества данных, чем может быть сохранено в одном байте. В контексте этой статьи, где его тип не может быть произвольно сложным, «поле» состоит из последовательной последовательности байтов и представляет собой «простое значение данных», которым - по крайней мере потенциально - можно управлять с помощью одной единственной аппаратной инструкции . Адрес такого поля - это в основном адрес его первого байта.

Еще одним важным атрибутом байта, являющегося частью «поля», является его «значение». Эти атрибуты частей поля играют важную роль в последовательности доступа к байтам аппаратным обеспечением компьютера, точнее: низкоуровневыми алгоритмами, влияющими на результаты компьютерной инструкции.

Числа

Позиционные системы счисления (в основном основание 10, основание 2 или основание 256 в случае 8-битных байтов) являются преобладающим способом представления целочисленных данных и, в частности, манипулирования ими с помощью компьютеров. В чистом виде это справедливо для средних размеров неотрицательных целых чисел, например , типа данных C unsigned. В такой системе счисления значение цифры, которую она вносит в целое число, определяется не только ее значением как одной цифры, но также позицией, которую она занимает в полном числе, называемой ее значением. Эти позиции могут быть отображены в памяти двумя способами:

  • уменьшение числового значения с увеличением адресов памяти (или увеличением времени), известное как big-endian и
  • возрастание числового значения с увеличением адресов памяти (или увеличением времени), известное как little-endian .

Целочисленные данные, которые напрямую поддерживаются аппаратным обеспечением компьютера, имеют фиксированную ширину малой мощности 2, например 8 бит 1 байт, 16 бит ≙ 2 байта, 32 бита ≙ 4 байта, 64 бита ≙ 8 байтов, 128 бит ≙ 16 байт. Последовательность низкоуровневого доступа к байтам такого поля зависит от выполняемой операции. Для сложения , вычитания и умножения в первую очередь обращаются к младшему байту . Для деления и сравнения в первую очередь обращаются к старшему байту . См. § Порядок расчета .

Для чисел с плавающей точкой см. § Плавающая точка .

Текст

Когда символьные (текстовые) строки должны сравниваться друг с другом, например, для поддержки какого-либо механизма , такого как сортировка , это очень часто делается лексикографически, когда один позиционный элемент (символ) также имеет позиционное значение. Лексикографическое сравнение означает почти везде: первый символ занимает высшее место - как в телефонной книге.

Целые числа, записанные в виде текста, всегда представляются в памяти первой старшей цифрой, что похоже на прямой порядок байтов, независимо от направления текста .

Аппаратное обеспечение

История

Многие исторические и существующие процессоры используют представление памяти с прямым порядком байтов либо исключительно, либо в качестве варианта конструкции. Другие типы процессоров используют представление памяти с прямым порядком байтов; другие используют еще одну схему, называемую прямым порядком байтов , смешанным порядком байтов или PDP-11- конечным .

Системы IBM / 360 использует обратный порядок байтов порядка байтов, как и его преемники System / 370 , ESA / 390 и г / Архитектура . В PDP-10 использует большой обратный порядок байт адресации для инструкций байт-ориентированных. В миникомпьютере IBM Series / 1 используется порядок байтов с прямым порядком байтов.

Работа с данными с разным порядком байтов иногда называется проблемой NUXI . Эта терминология ссылается на конфликты порядка байтов, возникающие при адаптации UNIX , работавшей на PDP-11 с прямым порядком байтов , к компьютеру IBM Series / 1 с прямым порядком байтов . Unix была одной из первых систем, позволивших компилировать один и тот же код для платформ с различным внутренним представлением. Одна из первых преобразованных программ должна была быть распечатана Unix, но на Series / 1 она была напечатана nUxi.

Datapoint 2200 использует простые бит последовательной логики с небольшим обратным порядком байтов для облегчения распространения переноса . Когда Intel разработала микропроцессор 8008 для Datapoint, они использовали прямой порядок байтов для совместимости. Однако, как Intel не удалось доставить 8008 во времени, Datapoint использовали средний масштаб интеграции эквивалент, но мало порядок байт был сохранен в большинстве Intel разрабатывает, включая MCS-48 и 8086 и его x86 наследников. DEC Alpha , Atmel AVR , VAX , то MOS Technology 6502 семьи ( в том числе Western Design Center 65802 и 65C816 ), в Zilog Z80 ( в том числе Z180 и eZ80 ), на Altera Nios II и многих других процессоров и процессоров семейств также мало- endian.

Motorola 6800 / +6801, в 6809 и серии 68000 процессоров использовал тупоконечник формата.

Intel 8051 , в отличие от других процессоров Intel, ожидает 16-битные адреса для LJMP и LCALL в формате big-endian; однако инструкции xCALL сохраняют адрес возврата в стеке в формате с прямым порядком байтов.

До версии 9 SPARC исторически использовал обратный порядок байтов, который является двунаправленным ; аналогично ранние процессоры IBM POWER были с прямым порядком байтов, но потомки PowerPC и Power ISA теперь имеют обратный порядок байтов. Архитектура ARM была с прямым порядком байтов до версии 3, когда она стала двунаправленной.

Текущие архитектуры

В сериях процессоров Intel x86 и AMD64 / x86-64 используется формат с прямым порядком байтов. Другие архитектуры набора команд, которые следуют этому соглашению, разрешая только режим с прямым порядком байтов, включают Nios II , Andes Technology NDS32 и Qualcomm Hexagon .

Некоторые архитектуры набора команд позволяют запускать программное обеспечение с прямым порядком байтов на архитектуре с обратным порядком байтов. Сюда входят ARM AArch64 , C-Sky , Power ISA и RISC-V .

Архитектуры с прямым порядком байтов включают IBM z / Architecture , Freescale ColdFire (на базе Motorola серии 68000 ), Atmel AVR32 и OpenRISC . IBM AIX и Oracle Solaris операционных систем на би-Endian питания ISA и SPARC работать в режиме обратного порядка; некоторые дистрибутивы Linux on Power перешли в режим прямого порядка байтов.

Двусторонний порядок байтов

Некоторые архитектуры (включая ARM версии 3 и выше, PowerPC , Alpha , SPARC V9, MIPS , PA-RISC , SuperH SH-4 и IA-64 ) имеют настройку, которая позволяет переключать порядок байтов при выборке и хранении данных, выборке инструкций или оба. Эта функция может повысить производительность или упростить логику работы сетевых устройств и программного обеспечения. Слово с обратным порядком байтов , когда говорится об аппаратном обеспечении, обозначает способность машины вычислять или передавать данные в любом формате с прямым порядком байтов.

Многие из этих архитектур можно переключить с помощью программного обеспечения на определенный по умолчанию формат с порядком байтов (обычно это делается при запуске компьютера); однако в некоторых системах порядок байтов по умолчанию выбирается аппаратно на материнской плате и не может быть изменен с помощью программного обеспечения (например, Alpha, которая работает только в режиме прямого байта на Cray T3E ).

Обратите внимание, что термин bi-endian в первую очередь относится к тому, как процессор обрабатывает доступ к данным. Доступ к инструкциям (выборка командных слов) на данном процессоре может по-прежнему предполагать фиксированный порядок следования байтов, даже если доступ к данным является полностью двузначным, хотя это не всегда так, например, в процессоре Intel Itanium на базе IA-64 , который позволяет и то, и другое.

Также обратите внимание, что некоторым номинальным процессорам с обратным порядком байтов требуется помощь материнской платы для полного переключения порядка байтов. Например, 32-разрядные процессоры PowerPC, ориентированные на настольные ПК, в режиме прямого порядка байтов действуют как процессоры с прямым порядком байтов с точки зрения выполняемых программ, но им требуется, чтобы материнская плата выполняла 64-разрядный обмен по всем 8-байтовым дорожкам, чтобы убедитесь, что к устройствам ввода-вывода будет применяться принцип прямого порядка байтов . В отсутствие этого необычного оборудования материнской платы программное обеспечение драйвера устройства должно записывать данные по разным адресам, чтобы отменить незавершенное преобразование, а также должно выполнять нормальную замену байтов.

Некоторые процессоры, такие как многие процессоры PowerPC, предназначенные для встроенного использования, и почти все процессоры SPARC позволяют выбирать порядок байтов для каждой страницы.

Процессоры SPARC с конца 1990-х годов (процессоры, совместимые с SPARC v9) позволяют выбирать порядок следования данных для каждой отдельной инструкции, загружаемой из памяти или сохраняемой в ней.

Архитектура ARM поддерживает два режима с прямым порядком байтов, называемые BE-8 и BE-32 . Процессоры до ARMv5 поддерживают только режим BE-32 или режим инвариантности слов. Здесь любой естественно выровненный 32-битный доступ работает так же, как в режиме с прямым порядком байтов, но доступ к байту или 16-битному слову перенаправляется на соответствующий адрес, а невыровненный доступ не разрешен. ARMv6 представляет BE-8 или байтовый инвариантный режим, в котором доступ к одному байту работает как в режиме с прямым порядком байтов, но доступ к 16-битному, 32-битному или (начиная с ARMv8) 64-битному слову приводит к замене байтов данных. Это упрощает доступ к невыровненной памяти, а также доступ с отображением памяти к регистрам, отличным от 32-битных.

У многих процессоров есть инструкции для преобразования слова в регистре в обратный порядок байтов, то есть они меняют порядок байтов в 16-, 32- или 64-битном слове. Однако все отдельные биты не меняются местами.

Последние процессоры с архитектурой Intel x86 и x86-64 имеют инструкцию MOVBE ( Intel Core с поколения 4, после Atom ), которая извлекает слово в формате с прямым порядком байтов из памяти или записывает слово в память в формате с прямым порядком байтов. В остальном эти процессоры являются полностью прямым порядком байтов. У них также уже был ряд инструкций подкачки для изменения порядка байтов содержимого регистров, например, когда слова уже были извлечены из ячеек памяти, где они находились в «неправильном» порядке байтов.

Плавающая запятая

Хотя сегодня повсеместно распространенные процессоры x86 используют память с прямым порядком байтов для всех типов данных (целые числа, числа с плавающей запятой), существует ряд аппаратных архитектур, в которых числа с плавающей запятой представлены в форме с прямым порядком байтов, а целые числа представлены с малым порядком байтов. Порядок байтов. Существуют процессоры ARM , которые имеют представление с плавающей запятой наполовину с прямым порядком байтов, наполовину с прямым порядком байтов с плавающей запятой для чисел с двойной точностью: оба 32-битных слова хранятся в обратном порядке байтов, как целочисленные регистры, но в первую очередь наиболее значимое. Поскольку существовало много форматов с плавающей запятой без « сетевого » стандартного представления для них, в стандарте XDR в качестве представления используется IEEE 754 с прямым порядком байтов. Поэтому может показаться странным, что широко распространенный стандарт с плавающей запятой IEEE 754 не определяет порядок байтов. Теоретически это означает, что даже стандартные данные с плавающей запятой IEEE, записанные на одной машине, могут быть нечитаемы на другой. Однако на современных стандартных компьютерах (т. Е. Реализующих IEEE 754) на практике можно с уверенностью предположить, что порядок байтов для чисел с плавающей запятой такой же, как и для целых, что делает преобразование простым независимо от типа данных. ( Другое дело - небольшие встроенные системы, использующие специальные форматы с плавающей запятой.)

VAX с плавающей запятой хранит 16-битные слова с прямым порядком байтов в порядке прямого байта.

Данные переменной длины

Большинство инструкций, рассмотренных до сих пор, содержат размер (длину) своих операндов в коде операции . Часто доступные длины операндов составляют 1, 2, 4, 8 или 16 байтов. Но есть также архитектуры, в которых длина операнда может храниться в отдельном поле инструкции или вместе с самим операндом, например, посредством словесной метки . Такой подход позволяет использовать операнды с длиной до 256 байт или даже с полным объемом памяти. Типами данных таких операндов являются символьные строки или BCD .

Машины, способные манипулировать такими данными с помощью одной инструкции (например, сравнить, добавить), - это, например, IBM 1401 , 1410 , 1620 , System / 3x0 , ESA / 390 и z / Architecture , все они имеют тип big-endian.

Оптимизация

Система с прямым порядком байтов имеет свойство, заключающееся в том, что одно и то же значение может быть прочитано из памяти с разной длиной без использования разных адресов (даже если наложены ограничения на выравнивание ). Например, 32-битная ячейка памяти с содержимым 4A 00 00 00может быть прочитана по тому же адресу, что и 8-битная (значение = 4A), 16-битная (004A), 24-битная (00004A) или 32-битная (0000004A) , все из которых сохраняют одно и то же числовое значение. Хотя это свойство с прямым порядком байтов редко используется непосредственно высокоуровневыми программистами, оно часто используется оптимизаторами кода, а также программистами на ассемблере .

Говоря более конкретно, такая оптимизация эквивалентна следующему коду C, возвращающему true в большинстве систем с прямым порядком байтов:

union {
  uint8_t u8; uint16_t u16; uint32_t u32; uint64_t u64;
} u = { .u64 = 0x4A };
puts(u.u8 == u.u16 && u.u8 == u.u32 && u.u8 == u.u64 ? "true" : "false");

Хотя это и не разрешено C ++, пробойный код такого типа разрешен как «определяемый реализацией» стандартом C11 и обычно используется в коде, взаимодействующем с оборудованием.

С другой стороны, в некоторых ситуациях может быть полезно получить приближение к многобайтовому или многословному значению путем чтения только его наиболее значимой части вместо полного представления; процессор с прямым порядком байтов может считывать такое приближение, используя тот же базовый адрес, который использовался бы для полного значения.

Такого рода оптимизации нельзя переносить между системами с разным порядком байтов.

Порядок расчета

Некоторые операции в позиционных системах счисления имеют естественный или предпочтительный порядок, в котором должны выполняться элементарные шаги. Этот порядок может повлиять на их производительность на небольших процессорах и микроконтроллерах с байтовой адресацией . Однако высокопроизводительные процессоры обычно извлекают типичные многобайтовые операнды из памяти за то же время, за которое они извлекали бы один байт, поэтому порядок байтов не влияет на сложность оборудования.

Сложение, вычитание и умножение начинаются с позиции младшего разряда и распространяют перенос на следующую, более значащую позицию. Адресация многозначных данных в их первом (= наименьшем адресе) байте является преобладающей схемой адресации. Когда этот первый байт содержит наименьшую значащую цифру, что эквивалентно малой конечности, реализация этих операций несколько проще.

Сравнение и деление начинаются с наиболее значимой цифры и распространяют возможный перенос на последующие менее значимые цифры. Для числовых значений фиксированной длины (обычно длины 1,2,4,8,16) реализация этих операций на машинах с прямым порядком байтов немного проще.

Многие процессоры с прямым порядком байтов (например, IBM System / 360 и его преемники) содержат аппаратные инструкции для лексикографического сравнения символьных строк различной длины.

Нормальный перенос данных с помощью оператора присваивания в принципе не зависит от порядка байтов процессора.

С прямым порядком байтов

Возможны многочисленные другие порядки, обычно называемые средним порядком байтов или смешанным порядком байтов . Одним из таких примеров за пределами информатики является стандартное американское форматирование даты месяц / день / год.

PDP-endian

PDP-11 в принципе 16-битной маленькой обратным порядком байтов системы. Инструкции для преобразования между значениями с плавающей запятой и целыми числами в дополнительном процессоре с плавающей запятой PDP-11/45, PDP-11/70 и в некоторых более поздних процессорах сохраняли 32-битные целые длинные значения двойной точности с 16-битные половины поменялись местами в ожидаемом порядке с прямым порядком байтов. UNIX С компилятор используется один и тот же формат для 32-битных длинных целых чисел. Такой порядок известен как PDP-endian .

Способ интерпретации этого порядка байтов состоит в том, что 32-битное целое число хранится в виде двух 16-битных слов с прямым порядком байтов, но сами слова имеют прямой порядок байтов (например, «jag cog sin» будет «gaj goc nis»):

Хранение 32-битного целого числа 0x0A0B0C0D на PDP-11
увеличение адресов   →
... 0B ч 0A ч 0D ч 0C ч ...
... 0A0B h 0C0D ч ...

16-битные значения здесь относятся к их числовым значениям, а не к их фактическому расположению.

Дескрипторы сегмента Intel IA-32

Сегмент дескрипторы из IA-32 и совместимых процессоров поддерживать 32-битный базовый адрес сегмента , хранящийся в маленьких обратном порядке байт порядка а, но в четырех непоследовательных байтах, в относительных положениях 2, 3, 4 и 7 начала дескриптора.

Байтовая адресация

Когда байты памяти печатаются последовательно слева направо (например, в шестнадцатеричном дампе ), младшее представление целых чисел имеет значение, увеличивающееся слева направо. Другими словами, при визуализации он появляется в обратном направлении, что может показаться нелогичным.

Такое поведение возникает, например, в FourCC или аналогичных методах, которые включают упаковку символов в целое число, так что оно становится последовательностью определенных символов в памяти. Давайте определим нотацию 'John'как просто результат записи символов в шестнадцатеричном коде ASCII и добавления их 0xк началу , и аналогично для более коротких последовательностей ( многосимвольный литерал C в стиле Unix / MacOS):

   '  J  o  h  n  '
hex  4A 6F 68 6E
----------------
   -> 0x4A6F686E

На машинах с прямым порядком байтов значение отображается слева направо, совпадая с правильным порядком строк для чтения результата:

увеличение адресов   →
... 4A ч 6F h 68 часов 6E h ...
... 'J' 'о' 'час' 'п' ...

Но на машине с прямым порядком байтов можно было бы увидеть:

увеличение адресов   →
... 6E h 68 часов 6F h 4A ч ...
... 'п' 'час' 'о' 'J' ...

Машины с прямым порядком байтов, такие как Honeywell 316 выше, еще больше усложняют это: 32-битное значение сохраняется в виде двух 16-битных слов 'hn' 'Jo' с прямым порядком байтов, которые сами имеют обратный порядок байтов (таким образом, 'h' 'n' 'J' 'o' ).

Обмен байтами

Обмен байтами заключается в маскировании каждого байта и их перемещении в правильное место. Многие компиляторы предоставляют встроенные модули , которые могут быть скомпилированы в инструкции собственного процессора ( bswap/ movbe), например __builtin_bswap32. Программные интерфейсы для подкачки включают:

  • Стандартные функции порядка следования байтов сети (от / до BE, до 32 бит). Windows имеет 64-битное расширение в формате winsock2.h.
  • endian.hФункции BSD и Glibc (от / до BE и LE, до 64-битных).
  • OSByteOrder.hмакросы macOS (от / до BE и LE, до 64-битных).

Файлы и файловые системы

Распознавание порядка байтов важно при чтении файла или файловой системы, созданных на компьютере с другим порядком байтов.

Некоторые наборы инструкций ЦП обеспечивают встроенную поддержку замены байтов с порядком байтов, например bswap( x86 - 486 и новее) и rev( ARMv6 и новее).

Некоторые компиляторы имеют встроенные средства для обмена байтами. Например, Intel Fortran компилятор поддерживает нестандартное CONVERTспецификатор при открытии файла, например: . OPEN(unit, CONVERT='BIG_ENDIAN',...)

Некоторые компиляторы имеют параметры для генерации кода, которые глобально разрешают преобразование для всех операций ввода-вывода файлов. Это позволяет повторно использовать код в системе с обратным порядком байтов без модификации кода.

Последовательные неформатированные файлы Fortran, созданные с одним порядком байтов, обычно не могут быть прочитаны в системе с использованием другого порядка байтов, потому что Fortran обычно реализует запись (определенную как данные, записанные одним оператором Fortran) как данные, которым предшествуют и после которых следуют поля счетчика, которые являются целыми числами, равными к количеству байтов в данных. Попытка прочитать такой файл с помощью Fortran в системе с другим порядком байтов приводит к ошибке времени выполнения, поскольку поля счетчика неверны. Этой проблемы можно избежать, записав последовательные двоичные файлы вместо последовательных неформатированных. Обратите внимание, однако, что относительно просто написать программу на другом языке (таком как C или Python ), которая анализирует последовательные неформатированные файлы Fortran с «чужим» порядком байтов и преобразует их в «родной» порядок байтов путем преобразования из «чужого» порядка байтов, когда чтение записей и данных Fortran.

Текст Unicode может необязательно начинаться с метки порядка байтов (BOM), чтобы обозначить порядок байтов в файле или потоке. Его кодовая точка - U + FEFF. В UTF-32 , например, большой обратный порядок байт файла должен начинаться с 00 00 FE FF; прямой порядок байтов должен начинаться с FF FE 00 00.

Форматы двоичных данных приложения, такие как, например, файлы MATLAB .mat или формат данных .bil , используемые в топографии, обычно не зависят от порядка байтов. Это достигается за счет сохранения данных всегда с фиксированным порядком байтов или переноса с данными переключателя, указывающего на порядок байтов.

Примером первого случая является двоичный формат файла XLS , который переносится между системами Windows и Mac и всегда с прямым порядком байтов, оставляя приложение Mac заменять байты при загрузке и сохранять при работе на процессоре Motorola 68K или PowerPC с прямым порядком байтов. .

Файлы изображений TIFF являются примером второй стратегии, заголовок которой сообщает приложению о порядке байтов их внутренних двоичных целых чисел. Если файл начинается с подписи, MMэто означает, что целые числа представлены с прямым порядком байтов, а IIозначает - с прямым порядком байтов. Для каждой из этих подписей требуется одно 16-битное слово, и они являются палиндромами (то есть они читают одно и то же вперед и назад), поэтому они не зависят от порядка байтов. Iозначает Intel и Mозначает Motorola , соответствующих поставщиков процессоров для совместимых платформ IBM PC (Intel) и Apple Macintosh (Motorola) в 1980-х годах. Процессоры Intel имеют прямой порядок байтов, а процессоры Motorola 680x0 - прямой порядок байтов. Эта явная подпись позволяет программе чтения TIFF при необходимости обменивать байты, когда данный файл был сгенерирован программой записи TIFF, запущенной на компьютере с другим порядком байтов.

Как следствие своей первоначальной реализации на платформе Intel 8080 файловая система таблицы размещения файлов (FAT), не зависящая от операционной системы, определяется с прямым порядком байтов, даже на платформах, изначально использующих другой порядок байтов, что требует операций перестановки байтов для поддержания жир.

Комбинированная файловая система ZFS / OpenZFS и диспетчер логических томов, как известно, обеспечивают адаптивный порядок байтов и работают как с прямым, так и с прямым порядком байтов.

Сети

Во многих документах IETF RFC используется термин сетевой порядок , означающий порядок передачи битов и байтов по сети в сетевых протоколах . Среди прочего, исторический RFC 1700 (также известный как Интернет-стандарт STD 2) определил сетевой порядок для протоколов в наборе Интернет-протоколов как прямой порядок байтов , отсюда и использование термина «сетевой порядок байтов» для байтов с прямым порядком байтов. порядок.

Однако не все протоколы используют порядок байтов с прямым порядком байтов в качестве сетевого порядка. Протокол Server Message Block (SMB) использует порядок байтов с прямым порядком байтов. В CANopen многобайтовые параметры всегда отправляются первым младшим байтом (с прямым порядком байтов). То же самое и с Ethernet Powerlink .

В Беркли Sockets API определяет набор функций для преобразования 16-битные и 32-битных чисел и из сетевого порядка байт: htons(хост-сети короткие) и htonl(хост-сеть длиной) преобразует 16- битовые и 32-битные значения соответственно от машины ( хоста ) к сетевому порядку; ntohsи ntohlфункции преобразования из сети в порядке хоста. Эти функции могут быть не оп на большой обратный порядок байт системы.

В то время как сетевые протоколы высокого уровня обычно рассматривают байт (в основном обозначаемый как октет ) как свою атомарную единицу, самые низкие сетевые протоколы могут иметь дело с упорядочением битов в байте.

Битовый порядок байтов

Нумерация битов - это концепция, аналогичная порядку байтов, но на уровне битов, а не байтов. Порядок следования битов или порядок следования битов на уровне битов относится к порядку передачи битов по последовательной среде. Битовый аналог little-endian (младший бит идет первым) используется в RS-232 , HDLC , Ethernet и USB . Некоторые протоколы используют обратный порядок (например, телетекст , I 2 C , SMBus , PMBus , SONET и SDH ), а ARINC 429 использует один порядок для поля метки, а другой порядок для оставшейся части кадра. Обычно существует согласованное представление битов независимо от их порядка в байте, так что последний становится актуальным только на очень низком уровне. Одно исключение вызвано функцией некоторых циклических проверок избыточности для обнаружения всех пакетных ошибок до известной длины, которая будет испорчена, если порядок битов отличается от порядка байтов при последовательной передаче.

Помимо сериализации, термины « порядок следования битов» и « порядок байтов на уровне битов» используются редко, поскольку редко встречаются компьютерные архитектуры, в которых каждый отдельный бит имеет уникальный адрес. Доступ к отдельным битам или битовым полям осуществляется через их числовые значения или, в языках программирования высокого уровня, через присвоенные имена, последствия которых, однако, могут зависеть от машины или не иметь переносимости программного обеспечения .

Примечания

использованная литература

Цитаты

дальнейшее чтение

внешние ссылки