Objective-c模拟HTML 5文件API readAsBinaryString()

时间:2012-01-28 19:43:54

标签: objective-c

使用HTML5文件API我可以使用FileReader.readAsBinaryString()获取文件的二进制字符串表示。对于图像,这可能会返回:“”ÿØÿàJFIFHHÿáExifMM* bj(1r2i¤ÐHHAdobePhotoshopCS Windows2006:07:12 15:24:47ÿÿ...“。使用Objective-C,我试图获得相同的表示形式文件。

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第252行。它在WebCore中,在WebKit中。

1 个答案:

答案 0 :(得分:2)

对于内存泄漏:你听说过--autorelease?

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

核心问题:

NSString假定将C字符串作为其“bytes”参数。因此它只会将文件内容提升到0x00字节,并将其解释为“终止NUL”字符。 顺便说一句,正确的方法是强制一个糟糕的NSString实例用无效的(非ASCII,非字符串!)垃圾来初始化自己。您最好使用NSData的-bytes方法来获取字节数组。您甚至可以使用以下内容访问其各个字节:

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