В вычислений , порядок байт это порядок или последовательность байтов одного слова цифровых данных в памяти компьютера . Порядок байтов в первую очередь выражается прямым порядком байтов ( BE ) или прямым порядком байтов ( LE ). В системе с прямым порядком байтов старший байт слова хранится по наименьшему адресу памяти, а младший байт - по наибольшему. В отличие от этого, в системе с прямым порядком байтов младший байт хранится по наименьшему адресу.
Порядок байтов может также использоваться для описания порядка, в котором биты передаются по каналу связи, например, обратный порядок байтов в канале связи сначала передает наиболее значимые биты. [1] Порядок следования битов редко используется в других контекстах.
Компьютеры хранят информацию в группах двоичных разрядов разного размера. Каждой группе присваивается номер, называемый ее адресом , который компьютер использует для доступа к этим данным. На большинстве современных компьютеров самая маленькая группа данных с адресом имеет длину восемь бит и называется байтом. Группы большего размера содержат два или более байта, например, 32-битное слово содержит четыре байта. Есть два возможных способа, которыми компьютер может пронумеровать отдельные байты в большей группе, начиная с любого конца. Оба типа байтов широко используются в цифровой электронной технике. Первоначальный выбор порядка байтов для нового дизайна часто бывает произвольным, но более поздние технологические изменения и обновления сохраняют существующий порядок байтов для сохранения обратной совместимости .
Внутри любой компьютер будет работать одинаково хорошо, независимо от того, какой порядок байтов он использует, поскольку его оборудование будет постоянно использовать один и тот же порядок байтов как для хранения, так и для загрузки данных. По этой причине программисты и пользователи компьютеров обычно игнорируют порядок байтов компьютера, с которым они работают. Однако порядок байтов может стать проблемой при перемещении данных за пределы компьютера - например, при передаче данных между разными компьютерами или при исследовании байтов данных внутреннего компьютера из дампа памяти программистом - и используемый порядок байтов отличается от ожидаемого. В этих случаях необходимо понимать и учитывать порядок байтов данных. Двусторонний порядок следования байтов - это функция, поддерживаемая многочисленными компьютерными архитектурами, которые поддерживают переключаемый порядок следования байтов при выборке и сохранении данных или выборке инструкций.
Порядок с прямым порядком байтов - это преобладающий порядок в сетевых протоколах, например, в наборе интернет-протоколов , где он называется сетевым порядком , когда первым передается наиболее значимый байт. И наоборот, порядок байтов с прямым порядком байтов является преобладающим для архитектур процессоров ( x86 , большинство реализаций ARM , базовые реализации RISC-V ) и связанной с ними памяти. Форматы файлов могут использовать любой порядок; в некоторых форматах используется сочетание того и другого.
Стили с прямым порядком байтов и прямым порядком байтов могут также использоваться в более общем плане для характеристики порядка любого представления, например цифр в системе счисления или частей даты . Числа в позиционной системе счисления обычно пишутся цифрами в прямом порядке, даже в сценариях с письмом справа налево . Точно так же языки программирования используют порядок чисел с прямым порядком байтов для числовых литералов .
Пример
Эти две диаграммы показывают, как два компьютера, использующие разный порядок байтов, хранят 32-битное (четырехбайтовое) целое число со значением 0x0A0B0C0D . В обоих случаях целое число разбивается на четыре байта, 0x0A , 0x0B , 0x0C и 0x0D , и байты сохраняются в четырех последовательных ячейках памяти в памяти, начиная с ячейки памяти с адресом a , затем a + 1 , a + 2 и a + 3 . Разница между старшим и младшим порядком байтов заключается в порядке сохранения четырех байтов целого числа.
На левой диаграмме показан компьютер с прямым порядком байтов. Это начинает сохранение целого числа с самым значимым байтом, 0x0A , по адресу a , и заканчивается наименее значимым байтом, 0x0D , по адресу a + 3 .
На правой диаграмме показан компьютер с прямым порядком байтов. Это начинает сохранение целого числа с наименее значимым байтом, 0x0D , по адресу a , и заканчивается самым значимым байтом, 0x0A , по адресу a + 3 .
Поскольку каждый компьютер использует одинаковую последовательность байтов для хранения и извлечения целого числа, результаты будут одинаковыми для обоих компьютеров. Проблемы могут возникнуть, когда память адресуется байтами, а не целыми числами, или когда содержимое памяти передается между компьютерами с разным порядком байтов.
Этимология
Прилагательное endian возникло в трудах англо-ирландского писателя 18 века Джонатана Свифта . В романе «Путешествия Гулливера» 1726 года он изображает конфликт между сектами лилипутов, разделенных на те, кто ломает скорлупу вареного яйца с большого конца или с маленького конца. Он назвал их Big-Endians и Little-Endians . [2] [3]
Дэнни Коэн ввел в информатику термины с прямым порядком байтов и прямым порядком байтов для упорядочения данных в заметке об эксперименте в Интернете, опубликованной в 1980 году. [4] [5] [6] [7]
Основы
Компьютерная память состоит из последовательности ячеек памяти (наименьших адресуемых единиц), обычно называемых байтами . Каждый байт идентифицируется и доступен в аппаратном и программном обеспечении по его адресу памяти . Если общее количество байтов в памяти равно n , то адреса нумеруются от 0 до n - 1.
Компьютерные программы часто используют структуры данных или поля, которые могут состоять из большего количества данных, чем может быть сохранено в одном байте. В контексте этой статьи, где его тип не может быть произвольно сложным, «поле» состоит из последовательной последовательности байтов и представляет собой «простое значение данных», которым - по крайней мере потенциально - можно управлять с помощью одной единственной аппаратной инструкции . Адрес такого поля - это в основном адрес его первого байта. [примечание 1]
Еще одним важным атрибутом байта, являющегося частью «поля», является его «значение». Эти атрибуты частей поля играют важную роль в последовательности доступа к байтам аппаратного обеспечения компьютера, точнее: алгоритмов низкого уровня, влияющих на результаты компьютерной инструкции.
Числа
Позиционные системы счисления (в основном основание 10, основание 2 или основание 256 в случае 8-битных байтов) являются преобладающим способом представления целочисленных данных и, в частности, манипулирования ими с помощью компьютеров. В чистом виде это справедливо для средних размеров неотрицательных целых чисел, например , типа данных C unsigned
. В такой системе счисления «значение» цифры, которую она вносит в целое число, определяется не только ее значением как одной цифры, но также и положением, которое она занимает в полном числе, называемым ее значением. Эти позиции могут быть отображены в памяти двумя способами: [8]
- уменьшение числового значения с увеличением адресов памяти (или увеличением времени), известное как big-endian и
- возрастание числового значения с увеличением адресов памяти (или увеличением времени), известное как little-endian . [заметка 2]
Целочисленные данные, которые напрямую поддерживаются аппаратным обеспечением компьютера, имеют фиксированную ширину малой мощности 2, например 8 бит 1 байт, 16 бит ≙ 2 байта, 32 бита ≙ 4 байта, 64 бита ≙ 8 байтов, 128 бит ≙ 16 байт. Последовательность доступа низкого уровня к байтам такого поля зависит от выполняемой операции: она антикоррелирует со значимостью байта для сложения , вычитания и умножения и коррелирует для деления и сравнения (см. § Порядок вычислений ).
Для чисел с плавающей точкой см. § Плавающая точка .
Текст
Когда символьные (текстовые) строки должны сравниваться друг с другом, например, для поддержки какого-либо механизма, такого как двоичный поиск , это очень часто делается лексикографически, когда один позиционный элемент (символ) также имеет позиционное значение. Лексикографическое сравнение означает почти везде: первый символ занимает высшее место - как в телефонной книге. [заметка 3]
Целые числа, записанные как текст, всегда сохраняются в памяти первой старшей цифрой, что похоже на прямой порядок байтов, независимо от направления текста .
Аппаратное обеспечение
История
Многие исторические и существующие процессоры используют представление памяти с прямым порядком байтов либо исключительно, либо в качестве варианта конструкции. Представление памяти с прямым порядком байтов обычно называют сетевым порядком, используемым в наборе Интернет-протоколов . Другие типы процессоров используют представление памяти с прямым порядком байтов; другие используют еще одну схему, называемую « средний порядок байтов », «смешанный порядок байтов» или « PDP-11- конечный».
Системы IBM / 360 использует обратный порядок байтов порядка байтов, как и его преемники System / 370 , ESA / 390 и г / Архитектура . PDP-10 также использует тупоконечник адресации для получения инструкций байт-ориентированных. Миникомпьютеры IBM Series / 1 также используют порядок байтов с прямым порядком байтов.
Работа с данными с разным порядком байтов иногда называется проблемой NUXI . [9] Эта терминология ссылается на конфликты порядка байтов, возникающие при адаптации UNIX , работающей на PDP-11 с прямым порядком байтов , к компьютеру IBM Series / 1 с прямым порядком байтов . Unix была одной из первых систем, позволивших компилировать один и тот же код для платформ с различным внутренним представлением. Одна из первых преобразованных программ должна была быть распечатана Unix
, но на Series / 1 она была напечатана nUxi
. [10]
Datapoint 2200 использует простые бит последовательной логики с небольшим обратным порядком байтов для облегчения распространения переноса . Когда Intel разработала микропроцессор 8008 для Datapoint, они использовали прямой порядок байтов для совместимости. Однако, как Intel не удалось доставить 8008 во времени, Datapoint использовали средний масштаб интеграции эквивалент, но мало порядок байт был сохранен в большинстве Intel разрабатывает, включая MCS-48 и 8086 и его x86 наследников. [11] [12] DEC Alpha , Atmel AVR , VAX , то MOS Technology 6502 семьи ( в том числе Western Design Center 65802 и 65C816 ), в Zilog Z80 ( в том числе Z180 и eZ80 ), на Altera Nios II и многих других процессоров и семейства процессоров также имеют прямой порядок байтов.
Motorola +6800 / 6801, в 6809 и серии 68000 процессоров использовал тупоконечник формата.
Intel 8051 , в отличие от других процессоров Intel, ожидает 16-битные адреса для LJMP и LCALL в формате big-endian; однако инструкции xCALL сохраняют адрес возврата в стеке в формате с прямым порядком байтов. [13]
До версии 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 . [14] Процессоры до 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 ) [15], которая извлекает слово в формате с прямым порядком байтов из памяти или записывает слово в память в формате с прямым порядком байтов. В остальном эти процессоры являются полностью прямым порядком байтов. У них также уже был ряд инструкций подкачки для изменения порядка байтов содержимого регистров, например, когда слова уже были извлечены из ячеек памяти, где они находились в «неправильном» порядке байтов.
Плавающая запятая
Хотя сегодня повсеместно распространенные процессоры x86 используют хранилище с прямым порядком байтов для всех типов данных (целые числа, числа с плавающей запятой), существует ряд аппаратных архитектур, в которых числа с плавающей запятой представлены в форме с прямым порядком байтов, а целые числа представлены с малым порядком байтов. Порядок байтов. [16] Существуют процессоры ARM , которые имеют представление с плавающей запятой наполовину с прямым порядком байтов, наполовину с прямым порядком байтов с плавающей запятой для чисел с двойной точностью: оба 32-битных слова хранятся в обратном порядке, как целочисленные регистры, но в первую очередь наиболее значимый. Поскольку существовало много форматов с плавающей запятой без « сетевого » стандартного представления для них, в стандарте XDR в качестве представления используется IEEE 754 с прямым порядком байтов. Поэтому может показаться странным, что широко распространенный стандарт с плавающей запятой IEEE 754 не определяет порядок байтов. [17] Теоретически это означает, что даже стандартные данные с плавающей запятой IEEE, записанные на одной машине, могут быть нечитаемы на другой. Однако на современных стандартных компьютерах (т. Е. Реализующих IEEE 754) на практике можно с уверенностью предположить, что порядок байтов для чисел с плавающей запятой такой же, как и для целых, что делает преобразование простым независимо от типа данных. ( Другое дело - небольшие встроенные системы, использующие специальные форматы с плавающей запятой.)
VAX с плавающей запятой хранит 16-битные слова с прямым порядком байтов в порядке прямого байта.
Данные переменной длины
Большинство инструкций, рассмотренных до сих пор, содержат размер (длину) своих операндов в коде операции . Часто доступные длины операндов составляют 1, 2, 4, 8 или 16 байтов. Но есть также архитектуры, в которых длина операнда может храниться в отдельном поле инструкции или в самом операнде, например. грамм. с помощью словесного знака . Такой подход позволяет использовать операнды с длиной до 256 байт или даже с полным объемом памяти. Типами данных таких операндов являются символьные строки или BCD .
Машины, способные манипулировать такими данными с помощью одной инструкции (например, сравнить, добавить), являются e. грамм. 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 в большинстве систем с прямым порядком байтов:
союз { uint8_t u8 ; uint16_t u16 ; uint32_t u32 ; uint64_t u64 ; } u = { . u64 = 0x4A }; помещает ( u . u8 == u . u16 && u . u8 == u . u32 && u . u8 == u . u64 ? "true" : "false" );
Хотя это и не разрешено C ++, пробойный код такого типа разрешен как «определяемый реализацией» стандартом C11 [18] и обычно используется [19] в коде, взаимодействующем с оборудованием. [20]
С другой стороны, в некоторых ситуациях может быть полезно получить приближение многобайтового или многословного значения путем чтения только его наиболее значимой части вместо полного представления; процессор с прямым порядком байтов может считывать такое приближение, используя тот же базовый адрес, который использовался бы для полного значения.
Такого рода оптимизации нельзя переносить между системами с разным порядком байтов.
Порядок расчета
Некоторые операции в позиционных системах счисления имеют естественный или предпочтительный порядок, в котором должны выполняться элементарные шаги. Этот порядок может повлиять на их производительность на небольших процессорах и микроконтроллерах с байтовой адресацией .
Однако высокопроизводительные процессоры обычно извлекают типичные многобайтовые операнды из памяти за то же время, за которое они извлекали бы один байт, поэтому порядок байтов не влияет на сложность оборудования.
Операции, начинающиеся с младшего разряда
Сложение, вычитание и умножение начинаются с позиции младшего разряда и распространяют перенос на следующую, более значащую позицию. Адресация многозначных данных в их первом (= наименьшем адресе) байте является преобладающей схемой адресации. Когда этот первый байт содержит наименьшую значащую цифру, что эквивалентно малой конечности, реализация этих операций несколько проще.
Операции, начинающиеся со старшей цифры
Сравнение и деление начинаются с наиболее значимой цифры и распространяют возможный перенос на последующие менее значимые цифры. Для числовых значений фиксированной длины (обычно длины 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 . [21]
Способ интерпретации этого порядка байтов состоит в том, что 32-битное целое число хранится в виде двух 16-битных слов с прямым порядком байтов, но сами слова имеют прямой порядок байтов (например, «jag cog sin» будет «gaj goc nis»):
увеличение адресов → | |||||
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):
' Джон 'шестигранник 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 бит). [22] Windows имеет 64-битное расширение в формате
winsock2.h
. endian.h
Функции BSD и Glibc (от / до BE и LE, до 64-битных). [23]-
OSByteOrder.h
макросы macOS (от / до BE и LE, до 64-битных).
Файлы и файловые системы
Распознавание порядка байтов важно при чтении файла или файловой системы, созданных на компьютере с другим порядком байтов.
Некоторые наборы команд ЦП обеспечивают встроенную поддержку замены байтов с порядком байтов, например bswap
[24] ( x86 - 486 и новее) и rev
[25] ( 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 с прямым порядком байтов. . [26]
Файлы изображений 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 и менеджер логических томов, как известно, обеспечивают адаптивный порядок байтов и работают как с прямым, так и с прямым порядком байтов. [27]
Сети
Во многих документах IETF RFC используется термин сетевой порядок , означающий порядок передачи битов и байтов по сети в сетевых протоколах . Среди прочего, исторический RFC 1700 (также известный как Интернет-стандарт STD 2) определил сетевой порядок для протоколов в наборе Интернет-протоколов как прямой порядок байтов , отсюда и использование термина «сетевой порядок байтов» для байтов с прямым порядком байтов. заказывать. [28]
Однако не все протоколы используют порядок байтов с прямым порядком байтов в качестве сетевого порядка. Протокол Server Message Block (SMB) использует порядок байтов с прямым порядком байтов. В CANopen многобайтовые параметры всегда отправляются первым младшим байтом (с прямым порядком байтов). То же самое и с Ethernet Powerlink . [29]
В Беркли Sockets API определяет набор функций для преобразования 16-битные и 32-битных чисел и из сетевого порядка байт: htons
(хост-сети короткие) и htonl
(хост-сеть длиной) преобразует 16- битовые и 32-битные значения соответственно от машины ( хоста ) к сетевому порядку; ntohs
и ntohl
функции преобразования из сети в порядке хоста. [30] [31] Эти функции могут быть не-оп на большой обратный порядок байт системы.
В то время как сетевые протоколы высокого уровня обычно рассматривают байт (в основном обозначаемый как октет ) как свою атомарную единицу, сетевые протоколы самого низкого уровня могут иметь дело с упорядочением битов внутри байта.
Битовый порядок байтов
Нумерация битов - это концепция, аналогичная порядку байтов, но на уровне битов, а не байтов. Порядок следования битов или порядок следования битов на уровне битов относится к порядку передачи битов по последовательной среде. Битовый аналог little-endian (младший бит идет первым) используется в RS-232 , HDLC , Ethernet и USB . Некоторые протоколы используют обратный порядок (например, телетекст , I 2 C , SMBus , PMBus и SONET и SDH [32] ). Обычно существует согласованное представление битов независимо от их порядка в байте, так что последний становится актуальным только на очень низком уровне. Одно исключение вызвано особенностью некоторых циклических проверок избыточности для обнаружения всех пакетных ошибок до известной длины, которая будет испорчена, если порядок битов отличается от порядка байтов при последовательной передаче.
Помимо сериализации, термины « порядок байтов» и « порядок байтов на уровне битов» используются редко, поскольку редко встречаются компьютерные архитектуры, в которых каждый отдельный бит имеет уникальный адрес. Доступ к отдельным битам или битовым полям осуществляется через их числовые значения или, в языках программирования высокого уровня, через присвоенные имена, последствия которых, однако, могут зависеть от машины или не иметь переносимости программного обеспечения .
Заметки
- ^ Исключением из этого правила является e. грамм. команда Add IBM 1401, которая адресует поля переменной длины в их позиции низкого (самого высокого адреса), а их длина определяется словесной меткой, установленной в их позиции высокого порядка (самой низкой адресации). Когда выполнялась такая операция, как сложение, процессор начинал с позиций младшего разряда по старшим адресам двух полей и продвигался вниз до старшего разряда.
- ^ Обратите внимание, что в этих выражениях термин «конец» означает край, на котором больше, соответственно. сначала пишется мало значения, а именно, где начинается поле.
- ^ Почти все машины, которые могут делать это с использованиемтолько одной инструкции (см. § Данные переменной длины ), так или иначе относятся к типу с прямым порядком байтов или, по крайней мере, с прямым порядком байтов.
Рекомендации
Цитаты
- ^ "RFC 1700" .
- ^ Свифт, Джонатан (1726). Путешествие Гулливера .
- ^ Брайант, Рэндал Э .; Дэвид, О'Халларон (2016), Компьютерные системы: взгляд программиста (3-е изд.), Pearson Education, стр. 79, ISBN 978-1-488-67207-1
- ^ Коэн, Дэнни (1980-04-01). О священных войнах и призыве к миру . IETF . IEN 137.
... какой бит должен двигаться первым, бит с маленького конца слова или бит с большого конца слова? Последователи первого подхода называются Little-Endians, а последователи последнего - Big-Endians.
Также опубликовано в IEEE Computer , октябрь 1981 выпуска . - ^ «Пионер Зала славы Интернета» . Интернет-зал славы . Интернет-сообщество .
- ^ Кэри, Дэвид. "Порядок байтов FAQ" . Проверено 11 октября 2010 .
- ^ «Происхождение терминов Big-Endian и Little-Endian» . 2004-01-21.
- ^ Таненбаум, Эндрю С .; Остин, Тодд М. (4 августа 2012 г.). Структурированная компьютерная организация . Prentice Hall PTR. ISBN 978-0-13-291652-3. Проверено 18 мая 2013 года .
- ^ «Проблема NUXI» . Жаргон файла . Проверено 20 декабря 2008 .
- ^ Jalics, Paul J .; Хайнс, Томас С. (1 декабря 1983 г.). «Перенос переносимой операционной системы: UNIX на миникомпьютер IBM». Коммуникации ACM . 26 (12): 1066–1072. DOI : 10.1145 / 358476.358504 . S2CID 15558835 .
- ^ Хаус, Дэвид; Фаггин, Федерико; Фини, Хэл; Гельбах, Эд; Хофф, Тед; Мазор, Стан; Смит, Хэнк (21 сентября 2006 г.). «Панель устной истории по разработке и продвижению микропроцессора Intel 8008» (PDF) . Музей истории компьютеров . п. b5 . Проверено 23 апреля 2014 года .
Мазор: И, наконец, оригинальный дизайн для Datapoint ... им нужна была [немного] серийная машина. И если вы подумаете о машине с последовательным интерфейсом, вы должны обрабатывать все адреса и данные по одному разряду, и рациональный способ сделать это: от младшего бита к старшему, потому что так будет распространяться перенос. Это означает, что [в] самой инструкции перехода 14-битный адрес будет помещен в машину с последовательным интерфейсом в обратном порядке, если вы посмотрите на него, потому что именно так вы хотели бы его обработать. Что ж, мы собирались построить байтовую параллельную машину, а не битовую последовательную, и наш компромисс (в духе клиента и только для него), мы поместили байты в обратном порядке. Мы помещаем сначала младший байт, а затем старший. С тех пор этот формат получил название «Little Endian», и это как бы противоречит тому, что вы думаете, было бы естественным. Что ж, мы сделали это для Datapoint. Как вы увидите, они никогда не использовали микросхему [8008], и поэтому в некотором смысле это была «ошибка», но этот [формат Little Endian] сохранился до 8080 и 8086 и [является] одной из отличительных черт. этой семьи.
- ^ Лунде, Кен (13 января 2009 г.). CJKV Обработка информации . O'Reilly Media, Inc. стр. 29. ISBN 978-0-596-51447-1. Проверено 21 мая 2013 года .
- ^ «Руководство пользователя Cx51: E. Порядок байтов» . keil.com .
- ^ «Отличия автобусов БЕ-32 и БЕ-8» .
- ^ «Как определить поддержку новых инструкций в семействе процессоров Intel® Core ™ 4-го поколения» (PDF) . Дата обращения 2 мая 2017 .
- ^ Savard, John JG (2018) [2005], «Форматы с плавающей запятой» , quadibloc , заархивировано из оригинала 03.07.2018 , получено 16.07.2018
- ^ «pack - преобразовать список в двоичное представление» .
- ^ «Стандарт C11» . ISO. Раздел 6.5.2.3 «Состав и члены Союза», §3 и сноска 95 . Проверено 15 августа 2018 .
95) Если член, используемый для чтения содержимого объекта объединения, не совпадает с членом, последним использовавшимся для хранения значения в объекте, соответствующая часть объектного представления значения переинтерпретируется как представление объекта в новом type, как описано в п. 6.2.6 (процесс, иногда называемый «перетеканием»).
- ^ «3.10 Параметры, управляющие оптимизацией: -fstrict-aliasing» . Коллекция компиляторов GNU (GCC) . Фонд свободного программного обеспечения . Проверено 15 августа 2018 .
- ^ Торвальдс, Линус (5 июня 2018 г.). "[GIT PULL] Обновление структуры свойств устройства для v4.18-rc1" . Ядро Linux (список рассылки) . Проверено 15 августа 2018 .
Дело в том, что использование объединения для воспроизведения текста является традиционным И СТАНДАРТНЫМ способом воспроизведения текста в gcc. Фактически, это * задокументированный * способ сделать это для gcc, когда вы, черт возьми, придурок и используете "-fstrict-aliasing" ...
- ^ Руководство по процессору PDP-11/45 (PDF) . Корпорация цифрового оборудования . 1973. с. 165.
- ^ - Руководство программиста Linux - Функции библиотеки
- ^ - Руководство программиста Linux - Функции библиотеки
- ^ «Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 2 (2A, 2B и 2C): Справочник по набору инструкций, AZ» (PDF) . Intel. Сентябрь 2016. с. 3–112 . Проверено 5 февраля 2017 .
- ^ «Справочное руководство ARMv8-A» . ARM Holdings .
- ^ «Спецификация формата двоичного файла Microsoft Office Excel 97 - 2007 (формат * .xls 97-2007)» . Корпорация Майкрософт. 2007 г.
- ^ Мэтт Аренс (2016). Внутреннее устройство ядра FreeBSD: подробный обзор кода . Документация OpenZFS / Чтение и запись лекции.
- ^ Рейнольдс, Дж . ; Постел, Дж. (Октябрь 1994 г.). «Обозначения данных» . Присвоенные номера . IETF . п. 3. DOI : 10,17487 / RFC1700 . СТД 2. RFC 1700 . Проверено 2 марта 2012 .
- ^ Группа стандартизации Ethernet POWERLINK (2012 г.), Рабочий проект предложения EPSG 301: Спецификация профиля связи Ethernet POWERLINK Версия 1.1.4 , глава 6.1.1.
- ^ IEEE и The Open Group (2018). «3. Системные интерфейсы». Базовые спецификации Open Group Выпуск 7 . 2 . п. 1120 . Проверено 9 апреля 2021 .
- ^ «htonl (3) - справочная страница Linux» . linux.die.net . Проверено 9 апреля 2021 .
- ^ Ср. П. 2.1 Передача битов draft-ietf-pppext-sonet-as-00 «Заявление о применимости PPP через SONET / SDH»
дальнейшее чтение
- Коэн, Дэнни (1980-04-01). О священных войнах и призыве к миру . IETF . IEN 137. Также опубликовано в IEEE Computer , октябрь 1981 выпуска .
- Джеймс, Дэвид В. (июнь 1990 г.). «Мультиплексные автобусы: войны с порядком байтов продолжаются». IEEE Micro . 10 (3): 9–21. DOI : 10.1109 / 40.56322 . ISSN 0272-1732 . S2CID 24291134 .
- Блан, Бертран; Маарауи, Боб (декабрь 2005 г.). "Порядок байтов или где байт 0?" (PDF) . Проверено 21 декабря 2008 . Цитировать журнал требует
|journal=
( помощь )
Внешние ссылки
- Понимание порядка байтов с прямым и обратным порядком байтов
- Последовательность байтов PPC
- Написание независимого от порядка байтов кода на C