2017-04-04 20 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ビットの符号なしポインタで指している場合、ARM(リトルエンディアン)の場合は0x33221100、実際の場合はx86(リトルエンディアン)などとなります。

0x33221100とx >> 16)& 0xFF 0x22を取得します。 (x >> 8)& 0xFFは0x11、x & 0xFFは0x00、(x >> 24)& 0xFFは0x33です。 {2,1,0,3}

あなたの混乱はどこですか? 0x00,0x11,0x22,0x33から0x33221100への変換ですか?リトルエンディアン、最下位バイトが最初にあるため、最も小さいまたは最初のアドレス(0x100)は最下位バイト(0x00は番号の下位8ビット)を持ち、0x101は次の最下位ビット8〜15,0x102ビット16〜23および0x103ビット24〜31を含む。

+0

アームプロセッサ上のビッグエンディアンが混乱しています。いくつかはBE32で、一部はBE8です。 –