В моем случае после того, как я попробовал все это предложение без везения, я связался с поддержкой Microsoft, и их предложение состояло в том, чтобы просто сменить пароль.
Это исправило мою проблему.
Обратите внимание, что пароль не истек, потому что я успешно выполнил вход в office365, однако сброс решил проблему.
Урок: не доверяйте истечению срока действия Office 365 дата, в моем случае срок действия пароля истекает через 1-2 месяца, но он не работает. Это привело меня к исследованию в моем коде, и только после того, как я понял, что проблема была в пароле Office365, который был «поврежден» или «досрочно истек».
Не забывайте каждые 3 месяца «обновить» пароль.
Существует два подхода к отображению порядка байтов: инвариантность адреса и инвариантность данных .
В этом типе отображения, адрес байтов всегда сохраняется между большим и мало. Это имеет побочный эффект инвертирования порядка значения (старший значащий к младшему значащему) конкретной данной величины (например, 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)
Существует также средний или смешанный порядок байтов. См. Википедия для деталей.
единственное время я должен был волноваться об этом, был при написании некоторого сетевого кода в C. Сети обычно используют IIRC с обратным порядком байтов. Большинство языков или краткий обзор все это или библиотеки предложения, чтобы гарантировать, что Вы используете правильный порядок байтов все же.
На самом деле я описал бы порядок байтов машины как порядок [1 112] байты внутренняя часть слова а не порядок [1 113] биты .
"байтами" там я имею в виду "самую маленькую единицу памяти, которой архитектура может управлять индивидуально". Так, если бы самая маленькая единица 16 битов длиной (что в x86 назвали бы Word ), затем, "слово" на 32 бита, представляющее значение 0xFFFF0000, могло быть сохранено как это:
FFFF 0000
или это:
0000 FFFF
в памяти, в зависимости от порядка байтов.
Так, если у Вас есть 8-разрядный порядок байтов, это означает, что каждое слово, состоящее из 16 битов, будет сохранено как:
FF 00
или:
00 FF
и так далее.
Лучшая статья я читал о порядке байтов" Обратный порядок байтов Понимания и Прямой порядок байтов ".
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;
};
В сущности порядок байтов относится к способу, которым процессор интерпретирует содержание данной ячейки памяти. Например, если у нас есть ячейка памяти 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
фундаментальное понятие является упорядочиванием битов:
1010 0011
в прямом порядке байтов совпадает с
0011 1010
в обратном порядке байтов (и наоборот).
Вы заметите изменения порядка путем группировки, не отдельным битом. Я не знаю о системе, например, где
1100 0101
была бы версия "другого-порядка-байтов" первой версии.
Филибер сказал,
биты были фактически инвертированы
Я сомневаюсь, что какая-либо архитектура нарушит инвариантность значения байта. Порядок битовых полей может потребовать инверсии при сопоставлении структур, содержащих их, с данными. Такое прямое сопоставление основано на особенностях компилятора, которые не входят в стандарт 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 в каждой нейтральной по порядку байтов, специфичной для приложения единице хранения данных заключается в том, что компиляторы упаковывают битовые поля в байты с растущими адресами.
«Порядок битов» в каждом байте не имеет значения, поскольку единственный способ их извлечения — это применение масок значений и сдвиг в направлении младшего или старшего бита. Проблема «порядка битов» станет важной только в воображаемых архитектурах с понятием битовых адресов. Я считаю, что все существующие архитектуры скрывают это понятие в аппаратном обеспечении и обеспечивают извлечение только наименьшего и старшего битов, что является понятием, основанным на значениях байтов, нейтральных по порядку байтов.