1

私の問題は次のとおりです。NSString を NSMutableData オブジェクトにカプセル化したいと考えています。しかし、最初にNSDataにカプセル化せずに、他のアイテムと一緒にやりたいと思います。やっぱりバイトだけじゃないですか。

私の最終的な NSMutableData オブジェクトは次のようになります

[header | stringLength | NSString]

headerchar でstringLengthあり、unsigned short です。このようにパケットを作成します

unsigned short stringLength = myString.length;
NSMutableData* nData = [NSMutableData dataWithBytes:(const void*)&header length:sizeof(char)];
[nData appendBytes:(const void*)&dataLength length:sizeof(unsigned short)];
[nData appendBytes:(const void*)myString length:stringLength];

次に、これを gkSession 経由で送信し、もう一方の端で文字列の長さを抽出してから、文字列自体を抽出します。

NSString* temp = [NSString alloc];
[data getBytes:(void*)&temp range:NSMakeRange(sizeof(char)+sizeof(unsigned short), stringLenght)];

何らかの理由で、これは私に悪いメモリアクセスを与えています. それmyString.lengthは私が期待することとまったく同じではないと思います。ヒントはありますか?前もって感謝します。

4

1 に答える 1

1

この行は正しくありません:

[nData appendBytes:(const void*)myString length:stringLength];

NSStringこれは、基礎となる構造の最初の部分(より大きい)をエンコードしていstringLengthます。

あなたが意味するのは:

[nData appendBytes:[myString UTF8String] 
            length:[myString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];

length文字数です。これは、マルチバイト文字のバイト数よりも大幅に少なくすることができます。

補足として、長さを1バイト(0〜255)に短縮できる場合、そのエンコーディングはPascal文字列と呼ばれ、CFStringそのエンコーディングをネイティブに処理できます(を参照CFStringGetPascalString())。あなたが一般的にやりたいことではありませんが、面白いです。CFStringCreateWithPascalStringNoCopy()メモリコピー操作を完全に回避できるので、これは特に便利です。これは主にレガシーサポート用であり、使用するためにフープを飛び越えることはありませんが、便利な場合もあります。

于 2012-06-28T13:02:29.543 に答える