2012-01-24 2 views
1

바이트 배열 (내 코드에서 char *)에서 다른 엔디안으로 저장된 32 비트 int를 읽는 함수를 구현하려고합니다. 나는 NSSwapInt를 사용할 것을 제안 받았지만, 그것에 대해 어떻게 해야할지에 대해선 우둔합니다. 누구든지 내게 스 니펫을 보여줄 수 있습니까?바이트 배열에서 NSSwapInt

미리 감사드립니다.

답변

7

Heres는 짧은 예 : docs에서 언급했듯이

integer:33619968 
bytes:02010000 
reverse integer: 258 
reverse bytes: 00000102 

,

는 IV의 바이트를 바꿔 넣, 결과 값을 리턴

unsigned char bytes[] = { 0x00, 0x00, 0x01, 0x02 }; 
int intData = *((int *)bytes); 
int reverseData = NSSwapInt(intData); 

NSLog(@"integer:%d", intData); 
NSLog(@"bytes:%08x", intData); 
NSLog(@"reverse integer: %d", reverseData); 
NSLog(@"reverse bytes: %08x", reverseData); 

가 출력 될 것이다 . 바이트는 각 하위 위치에서 상위 위치로 스왑되며 그 반대도 마찬가지입니다. 예를 들어, inv의 바이트 수가 1에서 4까지 번호가 매겨지면이 함수는 바이트 1과 4, 바이트 2와 3을 스왑합니다.

또한 NSSwapShort 및 NSSwapLongLong이 있습니다.

+0

굉장합니다, 감사합니다! 배열이 4 바이트보다 길면 위험합니까? 임시 버퍼에 복사해야합니까? – em70

+0

긴 버전과 긴 버전이 있습니다. –

1

정수 포인터를 사용하여이 문제를 해결하면 가능성이있는 데이터 정렬 오류 예외가 있습니다 (예 :). 일부 아키텍처에서는 32 비트 값이 2 또는 4 바이트의 배수 인 주소에 있어야합니다. iPhone 등에서 사용되는 ARM 아키텍처 이 경우에는 예외가 발생할 수 있지만 테스트 할 수있는 iOS 장치가 없습니까?

int32_t bytes2int(unsigned char *b) 
{ 
    int32_t i; 

    i = b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24; // little-endian, or 
    i = b[3] | b[2] << 8 | b[1] << 16 | b[0] << 24; // big-endian (pick one) 

    return i; 
} 

당신이 어떤 바이트 포인터를 전달할 수 있으며 32 비트를 만들기 위해 4 바이트를 조립합니다

어떤 부정 정렬 예외가 발생하지 않습니다하는이 작업을 수행하는 안전한 방법은 직접 정수를 조립하는 것입니다 int. 필요한 경우 아이디어를 64 비트 정수로 확장 할 수 있습니다.

관련 문제