Разница между старшим порядком байтов и младшим порядком байтов
В чем разница между порядком байтов Big Endian и Little Endian?
Кажется, что оба они связаны с Unicode и UTF16. Где именно мы это используем?
6 ответов
Big-Endian (BE) / Little-Endian (LE) - это два способа организации многобайтовых слов. Например, при использовании двух байтов для представления символа в UTF-16 существует два способа представления символа 0x1234
в виде строки байтов (0x00-0xFF):
Byte Index: 0 1
---------------------
Big-Endian: 12 34
Little-Endian: 34 12
Чтобы решить, использует ли текст UTF-16BE или UTF-16LE, спецификация рекомендует добавлять к строке метку порядка байтов (BOM), представляющую символ U+FEFF. Итак, если первые два байта текстового файла в кодировке UTF-16 FE
, FF
кодировка UTF-16BE. За FF
, FE
, это UTF-16LE.
Визуальный пример: слово "Пример" в разных кодировках (UTF-16 с спецификацией):
Byte Index: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
------------------------------------------------------------
ASCII: 45 78 61 6d 70 6c 65
UTF-16BE: FE FF 00 45 00 78 00 61 00 6d 00 70 00 6c 00 65
UTF-16LE: FF FE 45 00 78 00 61 00 6d 00 70 00 6c 00 65 00
Для получения дополнительной информации, пожалуйста, прочитайте страницу Википедии о Endianness и / или UTF-16.
Ответ Фердинанда (и других) правильный, но неполный.
Big Endian (BE) / Little Endian (LE) не имеют ничего общего с UTF-16 или UTF-32. Они существовали задолго до Unicode и влияют на то, как байты чисел сохраняются в памяти компьютера. Они зависят от процессора.
Если у вас есть номер со значением 0x12345678
тогда в памяти это будет представлено как 12 34 56 78
(BE) или 78 56 34 12
(LE).
UTF-16 и UTF-32 оказываются представленными соответственно в 2 и 4 байтах, поэтому порядок байтов учитывает порядок следования любого числа на этой платформе.
UTF-16 кодирует Unicode в 16-битные значения. Большинство современных файловых систем работают с 8-битными байтами. Так, например, чтобы сохранить файл UTF-16 на диске, например, вам нужно решить, какая часть 16-битного значения идет в первом байте, а какая во втором.
В Википедии есть более полное объяснение.
little-endian: прил.
Описывает архитектуру компьютера, в которой в данном 16- или 32-битном слове байты с более низкими адресами имеют меньшее значение (слово сохраняется "little-end-first"). Семейства компьютеров PDP-11 и VAX и микропроцессоры Intel, а также большое количество коммуникационного и сетевого оборудования не имеют аналогов. Этот термин иногда используется для описания порядка элементов, отличных от байтов; чаще всего биты внутри байта.
big-endian: прил.
[Общее; Из "Путешествия Гулливера" Свифта через знаменитую газету Дэнни Коэна "USC/ISI IEN 137" от 1 апреля 1980 года "Священные войны и призыв к миру"]
Описывает архитектуру компьютера, в которой в данном многобайтовом числовом представлении старший значащий байт имеет самый низкий адрес (слово хранится как "большой конец-первый"). Большинство процессоров, в том числе семейство IBM 370, PDP-10, семейства микропроцессоров Motorola и большинство различных RISC-конструкций, имеют старшую последовательность. Порядок байтов с прямым порядком байтов также иногда называют сетевым порядком.
--- из файла жаргона: http://catb.org/~esr/jargon/html/index.html
Big-endian и little-endian - это термины, которые описывают порядок, в котором последовательность байтов хранится в памяти компьютера.
1. Big-endian - это порядок, в котором "большой конец" (наиболее значимое значение в последовательности) сохраняется первым (по самому низкому адресу хранения).
2. Little-endian - это порядок, в котором "младший конец" (наименее значимое значение в последовательности) сохраняется первым.
Например
В компьютере с прямым порядком байтов два байта, необходимые для шестнадцатеричного числа 4F52
будет храниться как 4F52
в хранилище (if 4F is stored at storage address 1000, for example, 52 will be at address 1001).
В системе с прямым порядком байтов она будет храниться как 524F (52 at address 1000, 4F at 1001).
Порядковый номер байта (большой или маленький) должен быть указан для кодировки Unicode/UTF-16, потому что для кодов символов, которые используют более одного байта, существует выбор: читать или записывать самый старший байт первым или последним. Unicode/UTF-16, поскольку они являются кодировками переменной длины (т. Е. Каждый символ может быть представлен одним или несколькими байтами), это необходимо указать. (Однако обратите внимание, что "слова" в UTF-8 всегда имеют длину 8 бит / один байт [хотя символы могут быть несколькими точками], поэтому проблем с порядком байтов не существует.) Если кодировщик потока байтов представляет текст Unicode и декодер не согласен с тем, какое соглашение используется, неправильный код символа может быть интерпретирован. По этой причине либо соглашение о порядке байтов известно заранее, либо чаще в начале любого текстового файла / потока Unicode указывается метка порядка байтов, указывающая, используется ли порядковый номер с большим или меньшим порядком байтов.