Ответ 1
Существует два подхода к отображению endian: адресная инвариантность и инвариантность данных.
Инвариантность адресов
В этом типе сопоставления адрес байтов всегда сохраняется между большими и маленькими. Это имеет побочный эффект от изменения порядка значимости (наиболее значимого до наименее значимого) конкретной привязки (например, 2 или 4 байтового слова) и, следовательно, интерпретации данных. В частности, в little-endian интерпретация данных является наименее значимой для большинства значительных байтов, в то время как в big-endian интерпретация является наиболее значимой для наименее значимой. В обоих случаях набор доступных байтов остается неизменным.
Пример
Адресная инвариантность (также известная как байтовая инвариантность): адрес байта постоянный, а значение байта отменено.
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. Эффект сохранения значения привязки определенного размера заключается в том, что байтовые адреса байтов в пределах базиса обращаются между большими и маленькими суффиксами.
Пример
32-битная инвариантность данных (также известная как словоинвариантность): Базис - это 32-битовое слово, которое всегда имеет значение 0xddccbbaa
, не зависящее от конформации. Тем не менее, для доступа, меньшего, чем слова, адрес байтов меняется на противоположные между большими и маленькими отображениями endian.
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)
Пример
16-битная инвариантность данных (также известная как полусловная инвариантность): нулевой элемент - это 16-разрядный
который всегда имеет значение 0xbbaa
, независимое от конформации. Тем не менее, для доступа меньше полуслова адрес байтов меняется на противоположные между большими и маленькими отображениями endian.
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)
Пример
64-битная инвариантность данных (также известная как двойная инвариантность): Базис - это 64-разрядная
слово, всегда имеющее значение 0x99887766ddccbbaa
, не зависящее от сущности. Тем не менее, для доступа, меньшего, чем двойное слово, адрес байтов меняется на противоположные между большими и маленькими отображениями endian.
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)