3

iDevice で受信する必要がある 8 バイトの数値を (ac# Windows サーバーから) ネットワーク経由で送信しています。値は、私のサーバー (System.Int64) の「長い」変数です。を使用して、値が正しくバイト配列に変換されていることを確認しました

byte[] valueBytes = BitConverter.GetBytes(mylongvalue);

データは、NSData 変数を介して iDevice で受信されます。最初の 3 バイトをスキップし、次の 8 バイトを読み取って long long 値を計算する必要があります。

私はこれを試しました:

NSData * longlongValueBytes = [receivedData subDataWithRange:NSMakeRange(3,8)];
long long receivedLongLongValue = *(const long long *)[longlongValueBytes bytes];

ただし、これは 128 未満の値に対してのみ機能します。128 以上の値を送信すると、受信時に常に 127 が返されます。

何が欠けていますか?これは、符号の問題、またはエンディアンの問題に関連している可能性がありますか?

ご協力いただきありがとうございます。

4

1 に答える 1

3

(デバッガーなどを使用してNSLog) NSData の生のコンテンツをチェックして、正しく受信されていることを確認しましたか?

特に、異なるシステム (Windows Server と iOS デバイス) 間でエンディアンが異なっていないことを確認してください。一般に、バイトをネットワークに送信する前に、送信者または受信者のエンディアンに関係なく、バイトが「ビッグエンディアン」順序 (最上位バイトが最初) に対応する「ネットワーク バイト順序」で表されていることを確認します。 .

NSLog(@"data: %@", longlongValueBytes);コードを記述して、データの 16 進表現を表示し、予期したバイト数を受け取ったことを確認できます。

次に、これらのバイトを に変換するlong longには、コードの代わりにこれを試してください。

unsigned long long receivedLongLongValue = 0;
[longlongValueBytes getBytes:&receivedLongLongValue length:8];
NSLog(@"received long value: %llu", receivedLongLongValue);
于 2012-11-20T15:35:28.487 に答える