2016-08-25 8 views
1

iOS 바이트 주문에 문제가 있습니다. 우리는 BLE를 통해 메시지를 보내고 있습니다. 일부 값은 NSInteger 객체로 저장됩니다.iOS에서 일관된 바이트 순서를 유지하기 위해 엔디안을 감지하는 방법

이전 버전 (아직 지원됨)의 iPad에서 주변 기기가 올바르게 해석하기 위해 필요한 빅 엔디안 바이트 순서로 정수를 저장하는 것으로 보입니다. 가치, 그러나 새로운 아이폰에서 동일한 응용 프로그램을 실행하면 작동하지 않으며 endianness가 반대로됩니다. 당신이 바이트 순서는 두 장치에 다른 볼 수 있듯이 통해 오는

NSInteger number = 230; /* this is actually declared elsewhere, this is just for the example */ 

short value = (short)number; 

NSData* data = [NSData dataWithBytes:(void*)&value length:sizeof(value)]; 

int intData = [self intFromNSData:data]; 

결과 값은 그냥 필요하면 내가 감지 할 수 방법을 알고 싶어요, 바이트

On iPad: 230 (00E6) 
On iPhone: 58880 (E600) 

을 교환하다 주변기기로 보내기 전에. 또는이 장치를 저장하는 다른 방법이 모든 장치에서 일관 될 것입니까?

답변

4

앱을 실행하는 장치의 엔디안을 감지 할 필요가 없습니다. 항상 빅 엔디안으로 바이트를 보내려면 해당 NSSwapHostXXXToBig 함수를 사용하십시오.

short value = 230; 
short beValue = NSSwapHostShortToBig(value); 
NSData *data = ... 

또는 CFSwapXXXHostToBig 기능을 사용할 수 있습니다. 이들은 uint16_t과 같은 다양한 고정 크기 데이터 유형에서 잘 작동합니다.

uint16_t value = 230; 
uint16_t beValue = CGSwapInt16HostToBig(value); 
NSData *data = ... 

이들 각각에는 필요한 경우 big-endian 값을 적절한 호스트 값으로 변환하는 해당 기능이 있습니다.

관련 문제