2

私はここ数時間、非常に簡単な作業のように思われることで頭を叩いてきました。

私のアプリはtcpipを介してサーバーと通信しています。このプロトコルでは、各要求の最初の4バイトが、逆の順序でストリームの長さである必要があります。たとえば、長さが13の場合、(10進数の){0,0,0,13}を指定する必要があります。300の場合、{0,0,44,256}を指定する必要があります。次に、実際のデータが続きます。

どうやら、これはJavaやVBでも非常に簡単に実行できるようです(例:BitConverter.GetBytes(sendString.Length).Reverse()。ToArray())。しかし、obj-cではそれを機能させることができませんでした。運が悪かったので、NSString / NSData/NSArray間のあらゆる種類の変換を試しました。

前もって感謝します!

4

3 に答える 3

6

サーバーは、ビッグエンディアン順 (最上位バイトが最初) でデータを要求しています。ビッグ エンディアンは、インターネット プロトコル (IP、TCP、UDP、DNS などを含む) の標準的なネットワーク バイト順です。リトルエンディアン プラットフォーム用にコンパイルしている場合は、バイトを交換する必要があります。

ただし、リトルエンディアン プラットフォームに依存するべきではありません。代わりに、 Core Foundation のバイト交換関数を使用して、コードをローカル (ホスト) のバイト オーダーから独立させる必要があります。

具体的にはCFSwapInt32HostToBig、4 バイトの int をビッグ エンディアンの順序に変換するために使用する必要があります。リトルエンディアン プラットフォームでは、これによりバイトが再配置されます。ビッグ エンディアン プラットフォームでは、これは何もしません。

同様にCFSwapInt32BigToHost、サーバーから受信した 4 バイトの int をホストのバイト オーダーに変換するために使用する必要があります。

または、標準の POSIX バイト交換関数を使用できます。このhtonl関数は を表しhost-to-network-long、32 ビット int をホスト順からネットワーク (ビッグエンディアン) 順に変換します。このntohl関数は、32 ビットの int をネットワークからホストの順序に変換します。(これらの関数が作成された当時、一部の一般的なオペレーティング システムには 16 ビットの int と 32 ビットの long がありました。信じられますか?)

于 2012-07-16T22:10:05.923 に答える
1
NSInteger a = 300; //13;
char* aa = &a;
Byte b[] = {0,0,0,0};
memcpy(&b[0], &aa[3], 1);
memcpy(&b[1], &aa[2], 1);
memcpy(&b[2], &aa[1], 1);
memcpy(&b[3], &aa[0], 1);
于 2012-07-17T01:04:17.523 に答える
0

重複した質問に対する受け入れられた回答に示されているように、Foundation はバイト スワッピングの機能を提供します。この場合、long を扱っているので、おそらくNSSwapLong.

于 2012-07-16T22:03:49.107 に答える