2016-08-25 4 views
1

iOSバイトオーダーに問題があります。私たちはBLEを介してメッセージを送信していますが、一部の値はNSIntegerオブジェクトとして保存されています。iOSで一貫したバイトオーダーを維持するためのエンディアンを検出する方法

私は古い(まだサポートされている)iPadに、ビーエンディアンのバイトオーダーの整数を格納しています。しかし、新しいiPhoneで同じアプリケーションを実行しても動作しないので、エンディアンが逆転します。あなたがバイト順が2つのデバイス上で異なっている見ることができるように通じてくる結果の値が

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

、私はちょうど私が検出し、必要に応じて、バイトを入れ替えることができます方法を知っているしたい

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]; 

私は周辺機器にそれらを送信する前に。または、これらの番号を保存する方法がありますが、これはすべてのデバイスで一貫していますか?

答えて

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 = ... 

これらのそれぞれには、ビッグエンディアン値を必要に応じて適切なホスト値に変換する対応する機能があります。

関連する問題