Типы порядка байтов

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

Это исправило мою проблему.

Обратите внимание, что пароль не истек, потому что я успешно выполнил вход в office365, однако сброс решил проблему.

Урок: не доверяйте истечению срока действия Office 365 дата, в моем случае срок действия пароля истекает через 1-2 месяца, но он не работает. Это привело меня к исследованию в моем коде, и только после того, как я понял, что проблема была в пароле Office365, который был «поврежден» или «досрочно истек».

Не забывайте каждые 3 месяца «обновить» пароль.

14
задан starblue 17 June 2009 в 15:39
поделиться

8 ответов

Существует два подхода к отображению порядка байтов: инвариантность адреса и инвариантность данных .

Инвариантность Адреса

В этом типе отображения, адрес байтов всегда сохраняется между большим и мало. Это имеет побочный эффект инвертирования порядка значения (старший значащий к младшему значащему) конкретной данной величины (например, 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. Эффект сохранения значения конкретной размерной данной величины, то, что адреса байта байтов в данной величине инвертируются между отображениями с прямым порядком байтов и с обратным порядком байтов.

Пример

32-разрядная инвариантность данных (также известный как [1 110] инвариантность слова ): данная величина является 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)

Пример

16-разрядная инвариантность данных (также известный как [1 111] инвариантность полуслова ): данная величина является 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)

Пример

64-разрядная инвариантность данных (также известный как [1 112] инвариантность двойного слова ): данная величина является 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)
25
ответ дан 1 December 2019 в 08:44
поделиться

Существует также средний или смешанный порядок байтов. См. Википедия для деталей.

единственное время я должен был волноваться об этом, был при написании некоторого сетевого кода в C. Сети обычно используют IIRC с обратным порядком байтов. Большинство языков или краткий обзор все это или библиотеки предложения, чтобы гарантировать, что Вы используете правильный порядок байтов все же.

3
ответ дан 1 December 2019 в 08:44
поделиться

На самом деле я описал бы порядок байтов машины как порядок [1 112] байты внутренняя часть слова а не порядок [1 113] биты .

"байтами" там я имею в виду "самую маленькую единицу памяти, которой архитектура может управлять индивидуально". Так, если бы самая маленькая единица 16 битов длиной (что в x86 назвали бы Word ), затем, "слово" на 32 бита, представляющее значение 0xFFFF0000, могло быть сохранено как это:

FFFF 0000

или это:

0000 FFFF

в памяти, в зависимости от порядка байтов.

Так, если у Вас есть 8-разрядный порядок байтов, это означает, что каждое слово, состоящее из 16 битов, будет сохранено как:

FF 00

или:

00 FF

и так далее.

1
ответ дан 1 December 2019 в 08:44
поделиться

Лучшая статья я читал о порядке байтов" Обратный порядок байтов Понимания и Прямой порядок байтов ".

1
ответ дан 1 December 2019 в 08:44
поделиться

13 лет назад я работал над инструментом, портативным и к альфа-системе DEC и к ПК. На этой АЛЬФЕ DEC эти биты были на самом деле инвертированы . Это:

1010 0011

на самом деле переведенный в

1100 0101

Это было почти прозрачным и бесшовным в коде C за исключением того, что мне объявили битовое поле как

typedef struct {
   int firstbit:1;
   int middlebits:10;
   int lastbits:21;
};

, который должен был быть переведен в (использующий #ifdef условная компиляция)

typedef struct {
   int lastbits:21;
   int middlebits:10;
   int firstbit:1;
};
0
ответ дан 1 December 2019 в 08:44
поделиться

В сущности порядок байтов относится к способу, которым процессор интерпретирует содержание данной ячейки памяти. Например, если у нас есть ячейка памяти 0x100 со следующим содержанием (шестнадцатеричные байты)


  0x100:  12 34 56 78 90 ab cd ef

Reads    Little Endian            Big Endian
 8-bit:  12                        12
16-bit:  34 12                     12 34
32-bit:  78 56 34 12               12 34 56 78
64-bit:  ef cd ab 90 78 56 34 12   12 34 56 78 90 ab cd ef

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

TCP/IP указывает, что данные по проводу должны быть обратным порядком байтов. При передаче типов кроме массивов байтов (как указатели на структуры), необходимо удостовериться, что использовали ntoh/hton макросы, чтобы гарантировать, что данные отправляются обратный порядок байтов. Если Вы отправите с процессора с прямым порядком байтов на процессор с обратным порядком байтов (или наоборот), то данные будут искажены...

проблемы Кастинга:


 uint32_t* lptr = 0x100;
 uint16_t  data;
 *lptr = 0x0000FFFF

 data = *((uint16_t*)lptr);

, Каково будет значение данных? В системе с обратным порядком байтов это было бы 0 В системе с прямым порядком байтов, это будет FFFF

0
ответ дан 1 December 2019 в 08:44
поделиться

фундаментальное понятие является упорядочиванием битов:

1010 0011

в прямом порядке байтов совпадает с

0011 1010

в обратном порядке байтов (и наоборот).

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

1100 0101

была бы версия "другого-порядка-байтов" первой версии.

-1
ответ дан 1 December 2019 в 08:44
поделиться

Филибер сказал,

биты были фактически инвертированы

Я сомневаюсь, что какая-либо архитектура нарушит инвариантность значения байта. Порядок битовых полей может потребовать инверсии при сопоставлении структур, содержащих их, с данными. Такое прямое сопоставление основано на особенностях компилятора, которые не входят в стандарт C99, но могут быть общими. Прямое отображение быстрее, но не соответствует стандарту C99, который не предусматривает упаковку, выравнивание и порядок байтов. Код, совместимый с C99, должен использовать медленное сопоставление на основе значений, а не адресов. То есть, вместо этого

#if LITTLE_ENDIAN
  struct breakdown_t {
    int least_significant_bit: 1;
    int middle_bits: 10;
    int most_significant_bits: 21;
  };
#elif BIG_ENDIAN
  struct breakdown_t {
    int most_significant_bits: 21;
    int middle_bits: 10;
    int least_significant_bit: 1;
  };
#else
  #error Huh
#endif

uint32_t data = ...;
struct breakdown_t *b = (struct breakdown_t *)&data;

надо писать так (и так компилятор всё равно будет генерировать код даже для приведенного выше «прямого отображения»)

uint32_t data = ...;
uint32_t least_significant_bit = data & 0x00000001;
uint32_t middle_bits = (data >> 1) & 0x000003FF;
uint32_t most_significant_bits = (data >> 11) & 0x001fffff;

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

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

3
ответ дан 1 December 2019 в 08:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: