2017-04-04 64 views
1

我对ARM设备字节序的相位感到困惑。我正在测试的设备使用小端。与ARM处理器的字节序混淆

假设有代码在这里,其交换元件中的阵列:

uint32_t* srcPtr = (uint32_t*)src->get(); 
uint8_t* dstPtr = dst->get(); 

dstPtr[0] = ((*srcPtr) >> 16) & 0xFF; 
dstPtr[1] = ((*srcPtr) >> 8) & 0xFF; 
dstPtr[2] = (*srcPtr) & 0xFF; 
dstPtr[3] = ((*srcPtr) >> 24); 

我的理解是,如果srcPtr包含{0,1,2,3}输出dstPtr应该是{1,2,3, 0}。

但输出是dstPtr是{2,1,0,3}。

这是否意味着srcPtr以这种方式读取3,2,1 - > 0?

有人可以帮我吗? :)

这是由于小端?

回答

1

所以在地址0x100我有值0x00,0x11,0x22,0x33。 0x00在0x100,0x11在0x101等等。如果我在地址0x100指向一个32位无符号指针,那么我得到的值为0x33221100,对于ARM(小端)是true,对于x86(小端)是true。

所以现在如果我把0x33221100和>> 16)& 0xFF我得到0x22。 (x >> 8)& 0xFF是0x11,x & 0xFF是0x00和(x >> 24)& 0xFF是0x33。 {2,1,0,3}

你的困惑在哪里?它是从0x00,0x11,0x22,0x33到0x33221100的转换吗?小端,最低有效字节在前,因此遇到的最低或首地址(0x100)具有最低有效字节(该数字的低8位为0x00)等等0x101,次最低有效位8至15,0x102位16至23和0x103位24至31.对于32位值。

+0

现在在arm处理器上的big endian,这是令人困惑,尤其是当一些BE32和一些BE8 .... –