15

検索しました。しかし、まだ取得できませんでした。

NSdata を NSString に変換しています。<00000000 31323334 [data description]; 35363738> はい、文字列 @"12345678" を受信して​​います。

適切に NSString に変換するにはどうすればよいですか? 私は試した

NSString *b = [NSString stringWithUTF8String:[data bytes]];
NSString *a = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding];

どちらも null を返します。何か案が?ありがとう

こんにちは、すべての提案に感謝します。常にnull文字が前にあるため、一定のように見えます。何かを受け取るたびに、最初の <00000000> を削除するだけで、すでに正常に動作しています

4

3 に答える 3

27

これは、エンコーディングが正しくない場合に発生します。

ASCIIを使用してテストしてみてください。ASCIIは、ほぼ確実に、ある種の文字列を取得するために機能します。数字だけなら、おそらくうまくいくでしょう。

NSString *a = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSASCIIStringEncoding];

UTF-8エンコンディングを除いて、最も一般的なものは次のとおりです。

NSASCIIStringEncoding
NSUnicodeStringEncoding
NSISOLatin1StringEncoding
NSISOLatin2StringEncoding
NSSymbolStringEncoding

それらを試してみて、機能するかどうかを確認してください。

于 2012-04-16T17:50:43.240 に答える
6

NSdata を NSString に変換しています。【データ記述】をすると・・・ <00000000 31323334 35363738> が返されます。はい、文字列 @"12345678" を受け取りました。

いいえ -- その文字列を受信して​​いません。一連の 0x00 値で始まり、たまたま ASCII シーケンス「12345678」に対応する一連のバイトが続くバイト シーケンスを受信して​​います。

つまり、生データがあり、それを制約付きの型に変換しようとしていますが、制約付きの型は生データを表すことができないため変換できません。

NSString で「非可逆変換」API を使用してみることができますが、それは機能しない可能性があり、とにかく脆弱です。

最善の策?

実際に文字列を表す NSData 内のバイトのみを NSString のインスタンスに変換します。それはで行うことができます-initWithBytes:length:encoding:; 正しいオフセットと長さを見つけるには、計算を行う必要があります。

于 2012-04-16T17:57:39.233 に答える
2

これは、データの最初のバイトが 00 であることが原因である可能性があります。文字 0 は、文字列文字の末尾です。ASCII から (文字の配列またはバイトの配列から) 文字列を作成する場合、先頭に文字 0 があると、空の文字列が生成されます。

ただし、null ではなく、0 文字の NSString のインスタンスを返すことを期待しています。

于 2012-04-16T17:59:50.337 に答える