2017-04-04 67 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 .... –