Неожиданные результаты при приведении dword к байту [4] (endianity swap?)

Я пытаюсь бросить меч в массив из 4 байтов.
Когда я делаю это, байты, кажется, переворачиваются (изменяют порядок байтов)

Насколько я понимаю, dword, равный 0x11223344 в системах с прямым порядком байтов, будет выглядеть так:
0000_1011___0001_0110___0010_0001____0010_1100

но когда я делаю это:

typedef unsigned long dword;
typedef unsigned char byte;
int main(void)
{
dword a = 0x11223344;
byte b[4];
memcpy(b, &a, 4);
printf("%x %x %x %x\n", b[0], b[1], b[2], b[3]);
}

я получил 44 33 22 11.
Я ожидал, что это будет 11 22 33 44.

То же самое происходит, когда я использую reinterpret_cast или

union
{
dword a;
byte b[4];
} foo;

Я предполагаю, что я не прав, а не компилятор / процессор, но чего мне здесь не хватает?
Кроме того, как это будет выглядеть для системы с прямым порядком байтов?

Редактировать:
Так что я думаю, что мое понимание систем с прямым порядком байтов было неверным.
Другой вопрос: что было бы быстрее, оставаясь при этом переносимым: использование сдвигов для получения значений отдельных байтов или использование memcpy / reinterpret_cast и затем htonl () / ntohl ()?

-3

Решение

Нет, ваше понимание little-endian неверно. Младший порядок байтов означает, что младший байт находится на самом низком адресе памяти.

Также:

Насколько я понимаю, dword, равный 0x11223344 в системах с прямым порядком байтов, будет выглядеть так:

0000 1011 0001 0110 0010 0001 0010 1100

Этот битовый паттерн не имеет ничего общего с 0x11223344 вообще, будь то маленький или большой порядок байтов. На немного байтовой архитектуре, это будет читать

0100 0100 0011 0011 0010 0010 0001 0001

Однако для системы с прямым порядком байтов то же самое

0001 0001 0010 0010 0011 0011 0100 0100
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector