使用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中。
答案 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];