我试图将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()?
答案 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