2012-01-28 7 views
0

HTML5ファイルAPIの使用FileReader.readAsBinaryString()を使用してファイルのバイナリ文字列表現を取得できます。画像の場合、これは返されるかもしれません: ""ØØÿàJFIFHHÿExifMM* bj(1r2i¤HHAdobePhotoshop CS Windows2006:07:12 15:24:47ÿÿ... "Objective-Cを使用して、ファイル。HTML5ファイルAPIをエミュレートするObjective-c readAsBinaryString()

NSData *data = [NSData dataWithContentsOfFile:path]; 
unsigned char *aBuffer = malloc([data length]); 
[data getBytes: aBuffer length:[data length]]; 
return [[NSString alloc] initWithBytes:aBuffer length:[data length] encoding:NSASCIIStringEncoding]; 

上記は、(少なくとも)二つの問題があり、そこにメモリリークがあると出力があるだけで「ÿØÿà」。どのように私は完全な文字列を取得し、メモリリークを回避していますか?

編集私はこれを行うとき:。

NSData *data = [NSData dataWithContentsOfFile:path]; 
return [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSASCIIStringEncoding]; 

私はまったく同じ出力を得る

のWebKitは、(C++で)以下行います

m_stringResult = String(static_cast<const char*>(m_rawData->data()), m_bytesLoaded); 

FileReaderLoader.cpp、それは、WebKitの範囲内であるWebCore、内にあるライン252内にあること。

+1

をなぜ[::データのエンコーディングNSUTF8StringEncoding [NSStringのはalloc] initWithData]を返す'てみませんか?バッファリングを邪魔しないように保存します。 – Abizern

+0

アビザン、私がそれをするとき、私はまだ出力として 'ÿØÿ'を得る。私は残りの部分に何が起こっているのか分かりません。実際に、あなたが上記のものをコピーすると、私はnullになります。しかし、私がNSASCIIにエンコーディングを変更すると...私はちょうどそれらの4文字です。 – LDK

答えて

2

メモリリークの場合:あなたは-autoreleaseについて聞いたことがありますか?コアの問題については

return [[[NSString alloc] initWith...] autorelease]; 

NSStringのは、その "バイト" のパラメータとしてC文字列を取得することを前提としています。したがって、ファイルの内容は0x00バイトまでしか取得されません。この文字列は 'NUL'文字として解釈されます。 ところで、それを行う正しい方法は、貧弱なNSStringインスタンスが無効な(ASCII以外の、文字列ではない!)ゴミで自分自身を初期化することを強いられません。バイト配列を取得するには、NSDataの-bytesメソッドを使用することをお勧めします。あなたもこのようなものを使用して、その個々のバイトにアクセスすることができます; `

int index = [data lenght] - 1; 
char byteAtIndex = ((char *)[data bytes])[index]; 
+0

しかし、最終的に私はバイナリデータのNSString表現が必要です。ではNSDataからNSStringへどうやって行くのですか?これを行うNSData内の唯一の方法は、16進表現である説明です。 – LDK

+0

あなたはそれを行うことはできません。あなたがそれなしで仕事をすることができないなら、それはあなたのプログラムのデザイン問題です。 –

+0

WebKitがそれを行うことができれば、なぜ私はできないのですか? – LDK