将dword转换为byte [4]时的意外结果(endianity swap?)

时间:2013-08-23 21:19:42

标签: c++ casting endianness dword

我试图将dword转换为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;

我猜错了,而不是编译器/处理器,但我在这里缺少什么? 这也将如何看待大端系统?

编辑: 所以我想我对小端系统的理解是错误的。 另一个问题:在保持可移植性的同时会更快:使用shift来获取单个字节值或使用memcpy / reinterpret_cast然后使用htonl()/ ntohl()?

1 个答案:

答案 0 :(得分:4)

不,你对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