Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

Этот термин может также использоваться в более общем смысле для внутреннего упорядочивания любого представления, такого как цифры в системе счисления или разделы даты . Числа в позиционном обозначении записываются цифрами в прямом порядке, даже в сценариях с письмом справа налево . Точно так же в языках программирования используется порядок прямого байта цифр для числовых литералов, а также обратный порядок байтов для операций с битовым сдвигом (а именно, «левый» [для связи с младшим адресом] смещается в сторону MSB), независимо от порядка байтов. целевой архитектуры [ требуется пояснение ] .

Пример [ править ]

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

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

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

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

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

Этимология [ править ]

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

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

Основы [ править ]

Компьютерная память состоит из последовательности ячеек памяти (наименьших адресуемых единиц), обычно называемых байтами . Каждый байт идентифицируется и доступен в аппаратном и программном обеспечении по его адресу памяти . Если общее количество байтов в памяти равно n , то адреса нумеруются от 0 до n  - 1. Компьютерные программы часто используют структуры данных полей, которые могут состоять из большего количества данных, чем хранится в одном байте. Для целей этой статьи, где его использование в качестве операнда инструкции имеет значение, «поле» состоит из последовательной последовательности байтов и представляет собой простое значение данных, которым - по крайней мере потенциально - можно управлять однимаппаратная инструкция. Адрес такого поля - это в основном адрес его первого байта. [примечание 1] В дополнение к этому, он должен быть числового типа в некоторой позиционной системе счисления (в основном с основанием 10 или с основанием 2 - или с основанием 256 в случае 8-битных байтов). [примечание 2] В такой системе счисления «значение» цифры определяется не только ее значением как одной цифры, но также и положением, которое она занимает в полном числе, ее «значимостью». Эти позиции могут быть отображены в памяти двумя способами: [6]

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

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

Оборудование [ править ]

История [ править ]

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

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

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

Datapoint 2200 использует простые бит последовательной логики с небольшим обратным порядком байтов для облегчения распространения переноса . Когда Intel разработала микропроцессор 8008 для Datapoint, они использовали прямой порядок байтов для совместимости. Однако, как Intel не удалось доставить 8008 во времени, Datapoint использовали средний масштаб интеграции эквивалент, но мало порядок байт был сохранен в большинстве Intel разрабатывает, включая MCS-48 и 8086 и его x86 наследников. [9] [10] 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 сохраняют адрес возврата в стеке в формате с прямым порядком байтов. [11]

До версии 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 . [12] Процессоры до 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 ) [13], которая извлекает слово в формате с прямым порядком байтов из памяти или записывает слово в память в формате с прямым порядком байтов. В остальном эти процессоры являются полностью прямым порядком байтов. У них также уже был ряд инструкций подкачки для изменения порядка байтов содержимого регистров, например, когда слова уже были извлечены из ячеек памяти, где они находились в «неправильном» порядке байтов.

Плавающая точка [ править ]

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

Данные переменной длины [ править ]

Большинство инструкций, рассмотренных до сих пор, содержат размер (длину) своих операндов в коде операции . Часто доступные длины операндов составляют 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 [16] и обычно используется [17] в коде, взаимодействующем с оборудованием. [18]

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

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

Порядок расчета [ править ]

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

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

Операции, начинающиеся с младшего разряда [ править ]

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

Операции, начинающиеся со старшей цифры [ править ]

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

Операнды разной длины [ править ]

В языке программирования C лексикографическое сравнение строк символов должно быть сделано с помощью подпрограмм , которые часто предлагаются , и реализованы в виде подпрограммы (е. Г. STRCMP ).

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

Операции без воздействия [ править ]

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

С прямым порядком байтов [ править ]

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

PDP-endian [ править ]

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

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

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

Honeywell Series 16 [ править ]

16-битные компьютеры Honeywell Series 16, включая Honeywell 316 , являются противоположностью PDP-11 в хранении 32-битных слов в C. Он хранит каждое 16-битное слово в обратном порядке, [ цитата необходима ], но присоединяется их вместе с прямым порядком байтов: [ необходима цитата ]

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

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

Байтовая адресация [ править ]

Мало-конечное представление целых чисел имеет значение, возрастающее слева направо, если написано e. грамм. в свалке памяти . Другими словами, при визуализации он кажется перевернутым, что является странностью для программистов.

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

 ' Джон 'шестигранник 4A 6F ​​68 6E---------------- -> 0x4A6F686E

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

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

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

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

Обмен байтами [ править ]

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

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

Файлы и файловые системы [ править ]

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

Некоторые наборы инструкций ЦП обеспечивают встроенную поддержку замены байтов с порядком байтов, например bswap[22] ( x86 - 486 и новее) и rev[23] ( 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 с прямым порядком байтов. . [24]

Файлы изображений 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 и менеджер логических томов, как известно, обеспечивают адаптивный порядок байтов и работают как с прямым, так и с прямым порядком байтов. [25]

Сеть [ править ]

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

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

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

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

Порядок байтов [ править ]

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

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

Заметки [ править ]

  1. ^ Исключением из этого правила является e. грамм. команда Add IBM 1401, которая адресует поля переменной длины в их позиции низкого (самого высокого адреса), а их длина определяется словесной меткой, установленной в их позиции высокого порядка (самой низкой адресации). Когда выполнялась такая операция, как сложение, процессор начинал с позиции младшего из двух полей и продвигался к старшему.
  2. ^ Когда символьные (текстовые) строки сравниваются друг с другом, это делается лексикографически, когда один позиционный элемент (символ) также имеет позиционное значение. Лексикографическое сравнение означает почти везде: первый символ занимает высшее место - как в телефонной книге.
    Почти все машины, которые могут делать это, используятолько одну инструкцию (см. Раздел # Данные переменной длины ), так или иначе относятся к типу с прямым порядком байтов или, по крайней мере, с прямым порядком байтов. Следовательно, для применения критерия, приведенного ниже, предполагается, что рассматриваемый тип данных является числовым .
  3. ^ Обратите внимание, что в этих выражениях термин «конец» означает край, на котором больше, соответственно. Сначала пишется мало значения, а именно, где начинается объект.
  4. ^ Это наблюдение привело к созданию Intel машин LSB-first.

Ссылки [ править ]

Цитаты [ править ]

  1. ^ "RFC 1700" .
  2. ^ Свифт, Джонатан (1726). Путешествие Гулливера .
  3. ^ Коэн, Дэнни (1980-04-01). О священных войнах и призыве к миру . IETF . IEN 137. ... какой бит должен двигаться первым, бит с маленького конца слова или бит с большого конца слова? Последователи первого подхода называются Little-Endians, а последователи последнего - Big-Endians.Также опубликовано в IEEE Computer , октябрь 1981 выпуска .
  4. ^ "Интернет-пионер Зала славы" . Интернет-зал славы . Интернет-сообщество .
  5. ^ Кэри, Дэвид. "Порядок байтов FAQ" . Проверено 11 октября 2010 .
  6. ^ Таненбаум, Эндрю С .; Остин, Тодд М. (4 августа 2012 г.). Структурированная компьютерная организация . Prentice Hall PTR. ISBN 978-0-13-291652-3. Проверено 18 мая 2013 года .
  7. ^ "Проблема NUXI" . Жаргон файла . Проверено 20 декабря 2008 .
  8. ^ Jalics, Пол Дж .; Хайнс, Томас С. (1 декабря 1983 г.). «Перенос переносимой операционной системы: UNIX на миникомпьютер IBM». Коммуникации ACM . 26 (12): 1066–1072. DOI : 10.1145 / 358476.358504 . S2CID 15558835 . 
  9. Хаус, Дэвид; Фаггин, Федерико; Фини, Хэл; Гельбах, Эд; Хофф, Тед; Мазор, Стан; Смит, Хэнк (21 сентября 2006 г.). «Панель устной истории по разработке и продвижению микропроцессора Intel 8008» (PDF) . Музей истории компьютеров . п. b5 . Проверено 23 апреля 2014 года . Мазор: И, наконец, оригинальный дизайн для Datapoint ... им нужна была [немного] серийная машина. И если вы подумаете о машине с последовательным интерфейсом, вы должны обрабатывать все адреса и данные по одному разряду за раз, и рациональный способ сделать это: от младшего бита к старшему, потому что так будет распространяться перенос. Таким образом, это означает, что [в] самой инструкции перехода, способ, которым 14-битный адрес будет помещен в машину с последовательным интерфейсом, является побитовым, если вы смотрите на него, потому что вы хотите его обрабатывать именно так. Что ж, мы собирались построить байтовую параллельную машину, а не битовую последовательную, и наш компромисс (в духе клиента и только для него), мы поместили байты в обратном порядке. Мы помещаем сначала младший байт, а затем старший. С тех пор этот формат получил название «Little Endian», и это как бы противоречит тому, что, как вы думаете, было бы естественным. Что ж,мы сделали это для Datapoint. Как вы увидите, они никогда не использовали микросхему [8008], и поэтому в каком-то смысле это была «ошибка», но этот [формат Little Endian] сохранился до 8080 и 8086 и [является] одной из отличительных черт. этой семьи.
  10. ^ Лунде, Кен (13 января 2009). CJKV Обработка информации . O'Reilly Media, Inc. стр. 29. ISBN 978-0-596-51447-1. Проверено 21 мая 2013 года .
  11. ^ "Руководство пользователя Cx51: E. Порядок байтов" . keil.com .
  12. ^ «Различия между автобусами БЕ-32 и БЕ-8» .
  13. ^ «Как определить поддержку новых инструкций в семействе процессоров Intel® Core ™ 4-го поколения» (PDF) . Дата обращения 2 мая 2017 .
  14. ^ Савард, Джон JG (2018) [2005], «Форматы с плавающей запятой» , quadibloc , заархивировано из оригинала 03.07.2018 , получено 16.07.2018
  15. ^ "pack - преобразовать список в двоичное представление" .
  16. ^ "Стандарт C11" . ISO. Раздел 6.5.2.3 «Состав и члены Союза», §3 и сноска 95 . Проверено 15 августа 2018 . 95) Если член, используемый для чтения содержимого объекта объединения, не совпадает с членом, последним использовавшимся для хранения значения в объекте, соответствующая часть объектного представления значения переинтерпретируется как представление объекта в новом type, как описано в п. 6.2.6 (процесс, иногда называемый «перфорацией»).
  17. ^ «3.10 Параметры, управляющие оптимизацией: -fstrict-aliasing» . Коллекция компиляторов GNU (GCC) . Фонд свободного программного обеспечения . Проверено 15 августа 2018 .
  18. Торвальдс, Линус (5 июня 2018 г.). "[GIT PULL] Обновление структуры свойств устройства для v4.18-rc1" . Ядро Linux (список рассылки) . Проверено 15 августа 2018 . Дело в том, что использование объединения для воспроизведения текста является традиционным И СТАНДАРТНЫМ способом воспроизведения текста в gcc. Фактически, это * задокументированный * способ сделать это для gcc, когда вы, черт возьми, придурок и используете "-fstrict-aliasing" ...
  19. ^ Руководство по процессору PDP-11/45 (PDF) . Корпорация цифрового оборудования . 1973. с. 165.
  20. ^ byteorder(3)  -  Руководство программиста Linux - Функции библиотеки
  21. ^ endian(3)  -  Руководство программиста Linux - Функции библиотеки
  22. ^ «Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 2 (2A, 2B и 2C): Справочник по набору инструкций, AZ» (PDF) . Intel. Сентябрь 2016. с. 3–112 . Проверено 5 февраля 2017 .
  23. ^ "Справочное руководство ARMv8-A" . ARM Holdings .
  24. ^ «Спецификация формата двоичного файла Microsoft Office Excel 97–2007 (формат * .xls 97–2007)» . Корпорация Майкрософт. 2007 г.
  25. ^ Мэтт Аренс (2016). Внутреннее устройство ядра FreeBSD: подробный обзор кода . Документация OpenZFS / Чтение и запись лекции.
  26. ^ Рейнольдс, Дж . ; Постел, Дж. (Октябрь 1994 г.). «Обозначения данных» . Присвоенные номера . IETF . п. 3. DOI : 10,17487 / RFC1700 . STD 2. RFC 1700 . Проверено 2 марта 2012 .
  27. ^ Группа стандартизации Ethernet POWERLINK (2012), Рабочий проект предложения EPSG 301: Спецификация профиля связи Ethernet POWERLINK Версия 1.1.4 , глава 6.1.1.
  28. ^ Ср. П. 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