Существует два подхода к сопоставлению порядков байтов: инвариантность адресов и инвариантность данных .
Адрес инвариантности
В этом типе отображения адрес байтов всегда сохраняется между большим и маленьким. Это имеет побочный эффект изменения порядка значимости (от наиболее значимого к наименее значимому) конкретного элемента данных (например, 2 или 4-байтового слова) и, следовательно, интерпретации данных. В частности, в порядке с прямым порядком байтов интерпретация данных является наименее значимой для наиболее значимых байтов, тогда как в последовательности с прямым порядком байтов интерпретация является наиболее значимой или наименее значимой. В обоих случаях набор обращающихся байтов остается неизменным.
Пример
Неизменность адреса (также известная как неизменность байта ): адрес байта является постоянным, но значение байта меняется на противоположное.
Addr Memory
7 0
| | (LE) (BE)
|----|
+0 | aa | lsb msb
|----|
+1 | bb | : :
|----|
+2 | cc | : :
|----|
+3 | dd | msb lsb
|----|
| |
At Addr=0: Little-endian Big-endian
Read 1 byte: 0xaa 0xaa (preserved)
Read 2 bytes: 0xbbaa 0xaabb
Read 4 bytes: 0xddccbbaa 0xaabbccdd
инвариантность данных
В этом типе отображения относительная значимость байтов сохраняется для данных определенного размера. Таким образом, существуют разные типы данных, инвариантные к порядку байтов для разных размеров данных. Например, 32-разрядное слово-инвариантное отображение с прямым порядком байтов будет использоваться для размера данных 32. Эффект сохранения значения данных определенного размера заключается в том, что байтовые адреса байтов в пределах данных меняются местами между большими и младшими байтовыми отображениями .
Пример * +1026 *
32-битная инвариантность данных (также известная как неизменность слова ): элемент данных - это 32-битное слово, которое всегда имеет значение 0xddccbbaa
, независимо от порядка следования байтов. Однако для обращений, меньших слова, адрес байтов меняется на обратный между старшим и младшим порядковыми номерами.
Addr Memory
| +3 +2 +1 +0 | <- LE
|-------------------|
+0 msb | dd | cc | bb | aa | lsb
|-------------------|
+4 msb | 99 | 88 | 77 | 66 | lsb
|-------------------|
BE -> | +0 +1 +2 +3 |
At Addr=0: Little-endian Big-endian
Read 1 byte: 0xaa 0xdd
Read 2 bytes: 0xbbaa 0xddcc
Read 4 bytes: 0xddccbbaa 0xddccbbaa (preserved)
Read 8 bytes: 0x99887766ddccbbaa 0x99887766ddccbbaa (preserved)
* +1033 *
Пример * ** +1036 тысяча тридцать пять *
16-битная инвариантность данных (также известная как инвариантность половинного слова ): элемент данных является 16-битным
который всегда имеет значение 0xbbaa
, не зависящее от порядка байтов. Однако для обращений, меньших половины слова, адрес байтов меняется на обратный между старшим и младшим порядковыми номерами.
Addr Memory
| +1 +0 | <- LE
|---------|
+0 msb | bb | aa | lsb
|---------|
+2 msb | dd | cc | lsb
|---------|
+4 msb | 77 | 66 | lsb
|---------|
+6 msb | 99 | 88 | lsb
|---------|
BE -> | +0 +1 |
At Addr=0: Little-endian Big-endian
Read 1 byte: 0xaa 0xbb
Read 2 bytes: 0xbbaa 0xbbaa (preserved)
Read 4 bytes: 0xddccbbaa 0xddccbbaa (preserved)
Read 8 bytes: 0x99887766ddccbbaa 0x99887766ddccbbaa (preserved)
* ** 1044 тысяча сорок-три * Пример * * тысяча сорок-шести
64-битная инвариантность данных (также известная как инвариантность двойных слов ): элемент данных является 64-битным
Слово, которое всегда имеет значение 0x99887766ddccbbaa
, независимо от порядка следования. Однако для обращений, меньших двойного слова, адрес байтов меняется на обратный между старшим и младшим порядковыми номерами.
Addr Memory
| +7 +6 +5 +4 +3 +2 +1 +0 | <- LE
|---------------------------------------|
+0 msb | 99 | 88 | 77 | 66 | dd | cc | bb | aa | lsb
|---------------------------------------|
BE -> | +0 +1 +2 +3 +4 +5 +6 +7 |
At Addr=0: Little-endian Big-endian
Read 1 byte: 0xaa 0x99
Read 2 bytes: 0xbbaa 0x9988
Read 4 bytes: 0xddccbbaa 0x99887766
Read 8 bytes: 0x99887766ddccbbaa 0x99887766ddccbbaa (preserved)