データ オブジェクト内の未加工のバイトに直接アクセスできます。
void const *dataPtr = [data bytes];
生メモリへのポインタを取得したので、好きな方法でコピーできます (これらのルールは、iOS だけでなく、すべてのデータ転送に適用されます)。アラインメントの境界を考慮する必要がある場合は、memcpy を使用する必要があります。
int32_t myInt;
memcpy(&myInt, dataPtr);
それ以外の場合、アライメント境界を越えた整数操作を許可するアーキテクチャの場合...
int32_t myInt = *(int32_t const *)dataPtr;
現在、ARM はアラインメントの境界を越えたアクセスをサポートしていますが、はるかに低速です。私はパフォーマンスの比較を行っていませんが、不正にアラインされたポインターを使用し続けているわけではないため、memcpy 関数呼び出しよりも優れている可能性があります (ただし、正直なところ、それはパフォーマンスを考慮しすぎている可能性があります)。
最大の懸念事項は、データのバイト順です。それが提供されている場合は、好きなことをしてください。ただし、1 つの標準を優先する必要があります。
サードパーティからのものである場合は、おそらくネットワーク バイト オーダー (ビッグ エンディアン) です。ホスト エンディアン表現に変換する必要がある場合があります。幸いなことに、それはhton
andntoh
とその友人にとっては簡単なことです。
FWIW、Intel はリトルエンディアン、network-byte-order はビッグ エンディアン、最新の Mac と iOS デバイスはリトルエンディアン、古い Mac はビッグ エンディアンです。
// Convert from network order to host order.
// Does the right thing wherever your code is running
myInt = ntohl(myInt);
要するにどちらか...
int32_t myInt = ntohl(*(int32_t const *)[data bytes]);
また
int32_t myInt;
memcpy(&myInt, [data bytes);
myInt = ntohl(myInt);
したがって、データは何らかの方法でそこに到達する必要があります。それは、逆...
int32_t myInt = 42;
myInt = htonl(myInt);
NSData *data = [NSData dataWithBytesNoCopy:&myInt length:sizeof(myInt) freeWhenDone:NO];
もちろん、適切なデータ初期化子を使用してください...スタック上の生のバイトを使用するだけなので、スタックが巻き戻された後は使用しない方がよいでしょう。
データが何らかの境界に整列されることを受信者に保証しない限り、送信するデータの整列について心配する必要はありません。