Objective-c эмулирует HTML 5 Файловый API readAsBinaryString () - PullRequest
0 голосов
/ 28 января 2012

Используя API файлов HTML5, я могу получить представление файла в двоичной строке, используя FileReader.readAsBinaryString ().Для изображения это может вернуть: "" ÿØÿàJFIFHHÿáExifMM * bj (1r2i¤ÐHHAdobe Photoshop CS 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 Ответ

2 голосов
/ 28 января 2012

Для утечки памяти: вы слышали о -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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...