2012-04-16 11 views
13

私は検索しました。しかし、それでもそれを得ることができませんでした。NSData to NSStringはnullを返します

NSStringをNSStringに変換しています。 私は[data description]; を返します< 00000000 31323334 35363738> はい、私の文字列@ "12345678"を受け取りました。

NSStringに変換するにはどうすればよいですか? 私は

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

を試してみましたどちら私はnullを返します。 ありがとう

こんにちはすべて ありがとうございます。 常にinfrontのヌル文字が続きます。 何かを受け取ったときは、まず最初に< 00000000>を削除してから、すでに正常に動作しています

+0

SOでの検索はあなたに答えを得るでしょう – SomaMan

+0

こんにちは、私はどのように人々の答えを受け入れますか?私はアップキーをクリックしようとしましたが、私は15以上の評判が必要だと言います – user774150

答えて

26

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

テストするためにASCIIを使用してみてください。 ASCIIは文字列のいくつかを検索するためにほぼ確実に動作します。それが唯一の数字なら、それはおそらく動作します。 UTF-8 enconding除く

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

最も一般的には、次のとおりです。

NSASCIIStringEncoding 
NSUnicodeStringEncoding 
NSISOLatin1StringEncoding 
NSISOLatin2StringEncoding 
NSSymbolStringEncoding 

はそれらを試してみると、彼らが働くかどうかを確認します。

+1

NSASCIIStringEncodingが私のために働いていました。ありがとうございました。 –

6

私はNSStringのへのNSDataを変換しています。私が[データ記述]をするとき。それは 私に戻ります< 00000000 31323334 35363738>はい、私の文字列を受け取っています @ "12345678"。

ありません - あなたは、その文字列を受け取っていません。 0x00値の束で始まり、ASCIIシーケンス "12345678"に対応する一連のバイトが続きます。

I.e.生データがあり、制約タイプに変換しようとしていますが、制約タイプが生データを表すことができないためできません。

あなたはNSStringの上、「非可逆変換」のAPIを使用して試みることができるが、それは動作しない可能性がありますし、とにかく壊れやすいだろう。

Best bet?

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

2

あなたのデータの最初のバイトは00文字0が文字列の文字の最後であるためと考えられます。 ASCII文字列(文字配列またはバイト配列から)を作成するとき、最初に文字0が出現すると空文字列が生成されます。

しかし私はそれが0の文字、およびnullではないとのNSStringのインスタンスを返すことを期待します。

+1

文字列が '0x00'で終了するのは、C文字列の場合のみです。他の文字列型では、エンコーディング、長さ、およびデータの3倍として表現されることがよくあります。これはNSStringのケースです。 0x00はストリングが終了したと考えることを欺くものではなく、0x00はストリング内の無意味なバイトシーケンスなので、エラーを引き起こしています。 – bbum

関連する問題