2017-04-04 14 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 (리틀 엔디안)의 경우 true가됩니다.

이제 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입니다. –