Разница между порядком байтов Big Endian и Little Endian

В чем разница между порядком байтов Big Endian и Little Endian?

Оба они, похоже, связаны с Unicode и UTF16. Где именно мы это используем?


person web dunia    schedule 31.03.2009    source источник
comment
en.wikipedia.org/wiki/Endianness   -  person Mitch Wheat    schedule 31.03.2009
comment
Не забывайте о MIDDLE endian. Это на странице вики.   -  person Jason Punyon    schedule 31.03.2009
comment
@Mitch: то же самое можно сказать практически о любом вопросе.   -  person Jon B    schedule 31.03.2009
comment
@Jon B: Да, может, но на некоторые вопросы лучше ответить с помощью постоянных исследований, чем с помощью пары ответов, которые дали некоторые эксперты.   -  person Cerebrus    schedule 31.03.2009
comment
@BALAMURUGAN: BigEndian и Little Endian появляются только при наличии многобайтовых данных.   -  person Dead Programmer    schedule 08.04.2011
comment
Красиво объясненный betterexplained.com/articles/   -  person Atiq    schedule 04.12.2015


Ответы (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 с BOM):

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.

person Ferdinand Beyer    schedule 31.03.2009
comment
Порядок байтов постоянно противоречит интуиции, поскольку BE хранит самый старший байт в наименьшем адресе, а не в последнем / конечном адресе. Что бы ни. Этот сайт проясняет ситуацию: Big and Little Endian, При обратном порядке байтов старший байт хранится в наименьшем адресе. Кстати, Наглядный пример оказался полезным. - person bvj; 06.09.2016
comment
При желании вы можете изменить слова, чтобы сделать их более понятными: [При обратном порядке байтов старший байт хранится в наименьшем адресе.] ИЛИ [При обратном порядке байтов вы сохраняете младший байт в наибольшем адресе.] То же самое - person Lakey; 28.12.2016

Ответ Фердинанда (и других) правильный, но неполный.

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 байтах, поэтому порядок байтов соответствует порядку, который следует за любым числом на этой платформе.

person Mihai Nita    schedule 24.07.2009

UTF-16 кодирует Unicode в 16-битные значения. Большинство современных файловых систем работают с 8-битными байтами. Итак, чтобы сохранить файл в кодировке UTF-16 на диск, например, вы должны решить, какая часть 16-битного значения идет в первый байт, а какая - во второй.

Википедия содержит более полное объяснение.

person joev    schedule 31.03.2009
comment
этот ответ неверен. порядок байтов связан с базовой аппаратной архитектурой - person Mitch Wheat; 31.03.2009
comment
Вы можете сохранить файл в кодировке UTF-16 в любом порядке байтов независимо от используемого оборудования. - person joev; 31.03.2009
comment
Учитывая в контексте вопроса, этот ответ вполне приемлем ИМХО. - person Binary Worrier; 31.03.2009
comment
@joev: Совершенно верно. Часто это связано с архитектурой оборудования, но не обязательно. Следовательно, для кросс-платформенной совместимости кодировщики / декодеры Unicode должны иметь возможность использовать любой порядок байтов. - person Noldorin; 31.03.2009

прямой порядок байтов: прил.

Описывает компьютерную архитектуру, в которой в данном 16- или 32-битном слове байты по младшим адресам имеют меньшее значение (слово хранится «сначала маленький конец»). Семейства компьютеров PDP-11 и VAX, микропроцессоры Intel и большое количество коммуникационного и сетевого оборудования имеют прямой порядок байтов. Этот термин иногда используется для описания порядка блоков, отличных от байтов; чаще всего биты в байте.

с прямым порядком байтов: прил.

[общий; Из «Путешествий Гулливера» Свифта через знаменитую статью Дэнни Коэна «О священных войнах и призыве к миру», USC / ISI IEN 137, от 1 апреля 1980 г.]

Описывает компьютерную архитектуру, в которой в заданном многобайтовом числовом представлении наиболее значимый байт имеет наименьший адрес (слово хранится «сначала на большом конце»). Большинство процессоров, включая семейство IBM 370, PDP-10, семейства микропроцессоров Motorola и большинство различных конструкций RISC, имеют обратный порядок байтов. Порядок байтов с прямым порядком байтов иногда называют сетевым порядком.

--- из файла жаргона: http://catb.org/~esr/jargon/html/index.html

person Paul Reiners    schedule 04.05.2010

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).

person nagarajan    schedule 18.02.2015

Порядок байтов (большой или маленький) необходимо указать для кодировки Unicode / UTF-16, потому что для коды символов, которые используют более одного байта, можно выбрать, следует ли читать / записывать наиболее значимый байт первым или последним. Для Unicode / UTF-16, поскольку они являются кодировками переменной длины (т.е. каждый символ может быть представлен одним или несколькими байтами), необходимо указать это. (Обратите внимание, однако, что «слова» UTF-8 всегда имеют длину 8 бит / один байт [хотя символы могут быть несколькими точками], поэтому нет проблем с порядком байтов.) Если кодировщик потока байтов, представляющих текст Unicode, и декодер не договорился о том, какое соглашение используется, может быть интерпретирован неправильный код символа. По этой причине либо порядок байтов известен заранее, либо чаще используется знак порядка байтов. обычно указывается в начале любого текстового файла / потока Unicode, чтобы указать, используется ли большой или маленький порядок следования байтов.

person Noldorin    schedule 31.03.2009
comment
этот ответ неверен. порядок байтов связан с базовой аппаратной архитектурой - person Mitch Wheat; 31.03.2009
comment
UTF-8 - это кодировка с переменной длиной, использующая 1-6 байтов на символ и, следовательно, не привязана к одному байту, как указано здесь! - person Ferdinand Beyer; 31.03.2009
comment
Верно, поэтому я не утверждал, что порядок байтов зависит от архитектуры оборудования, но я не понимаю, почему мой ответ явно неверен. Учтите, что для текстовых файлов, записываемых / читаемых на разных архитектурах, должен быть известен порядок байтов. - person Noldorin; 31.03.2009
comment
@Ferdinand: Вы правы - я должен упомянуть, что некоторые варианты UTF-8 не требуют этого ... - person Noldorin; 31.03.2009
comment
Извините, вы все еще не поняли. Нет вариантов UTF-8, которые не требуют нескольких байтов. Если вы используете только символы ASCII, UTF-8 будет представлять их в виде одиночных байтов. Все символы с символьным кодом ›127 будут закодированы в несколько байтов! - person Ferdinand Beyer; 31.03.2009
comment
Для полноты - UTF-8 требует от 1 до 4 байтов. Допустимый UTF-8 не может содержать более 4 байтов. - person Nemanja Trifunovic; 31.03.2009
comment
@Noldorin: Как я уже сказал, символы ASCII используют один байт. Это свойство UTF-8, а не вариант! Используя однобайтовые символы, вы не можете кодировать значения Unicode, отличные от ASCII. - person Ferdinand Beyer; 31.03.2009
comment
@ Фердинанд: Да, я понял это после вашего первоначального исправления. Сообщение было снова прояснено, насколько я понимаю вашу точку зрения ... хотя я думаю, что я несколько запутался в процессе исправления. :П - person Noldorin; 31.03.2009
comment
(продолжение) Думаю, я прав, говоря, что, поскольку слова в UTF-8 имеют длину 8 бит / один байт (неизменно, несмотря на переменную длину кодов символов), то, по крайней мере, нет проблем с порядком байтов. - person Noldorin; 31.03.2009
comment
unicode.org/faq/utf_bom.html, похоже, согласен, хотя снова поправьте меня, если я я ошибаюсь ... - person Noldorin; 31.03.2009