2012-04-24 6 views
3

同じNSDictionaryオブジェクトをNSDataに変換した後、NSJSONSerializationとSBJsonWriterを何度か使ってNSStringを変換しようとしましたが、時々別の文字列があります。偶数ヌル。それは非常に奇妙で、私は何らかの理由を見つけることができません。 =(JSONKitとYAJLは、このような問題を持っていません。 後、私のテストコードです。NSJSONSerializationとSBJsonが奇妙に動作する

for (int i = 0; i < 5; i++) { 
    NSDictionary *d = [NSDictionary dictionaryWithObject:@"value" forKey:@"key"]; 
    NSData *data = [NSJSONSerialization dataWithJSONObject:d options:0 error:nil]; 
    NSLog(@"%@", [NSString stringWithUTF8String:data.bytes]); 
} 

とコンソール出力される...

2012-04-25 01:35:33.113 Test[19347:c07] {"key":"value"} 
2012-04-25 01:35:33.114 Test[19347:c07] (null) 
2012-04-25 01:35:33.114 Test[19347:c07] {"key":"value"} 
2012-04-25 01:35:33.114 Test[19347:c07] {"key":"value"} 
2012-04-25 01:35:33.115 Test[19347:c07] (null) 

出力は、私がテストを実行するたびに変更NSDataオブジェクト内のコード。 データのバイトサイズは同じですが、UTF8変換文字列の長さが変化する。

答えて

5

バイトは必ずしもNUL終端された文字列を含まない。あなたはにデータを変換したい場合0、代わりにこれを行う:一部のパーサは、彼らがより多くの予想通りに振る舞う理由を説明し、彼らは安全のために返すデータの末尾に「\ 0」を書くことを可能性があります

[[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding] 

。しかし、あなたが見たように、その行動に頼るべきではありません。

+0

私はちょうどOPのコードを実行するプレイを持っていたし、間違いなくあなたが正しいと思う。 'NSData'は毎回同じように作成され、失敗している' NSString'の作成です。おそらく、データの終わりを越えるバイトが動作した場合には、たぶん '\ 0'となるでしょう。 – mttrb

+0

確かに、 'stringWithUTF8String:'がnilを返す場合、無効なUTF-8バイトシーケンスとbailsが見受けられますが、これは適切な動作です。 – warrenm

+0

妥当な説明のように聞こえます。 – mttrb