Подтвердить что ты не робот

StringWithUTF8String не работает, но только иногда

У меня есть следующий бит кода:

NSData *data = [NSData dataWithContentsOfFile:filePath options:0 error:&fileError];
NSString *recipe = @"";
if (fileError == nil) {
     recipe = [NSString stringWithUTF8String:[data bytes]];
     NSLog(@"Converted Recipe as: %@",recipe);
     NSLog(@"Original Data was: %@",data);  
} else {
     NSLog(@"Error reading file: %@", [fileError localizedDescription]);
}

Проблема в том, что иногда stringWithUTF8String возвращает null, а иногда корректно возвращает содержимое файла... SAME файл. Иногда это работает, а иногда и нет. Вот фрагмент из журнала, когда он этого не делает.... Что означает для меня, что чтение файла работает, но по какой-то причине преобразование не удалось на этот раз. Если я снова это сделаю (это называется результатом tableView didSelectRowAtIndexPath: поэтому я могу просто щелкнуть по другой строке, а затем вернуться к этому.

2010-08-01 16:14:29.031 RecipeBrowse[52056:207] Converted Recipe as: (null)
2010-08-01 16:14:29.037 RecipeBrowse[52056:207] Original Data was: <426c6163 6b656e65 64204361 626f2046 69736820 5461636f 730a0a49 4e475245 4449454e 54533a0a 0a2d200a 0a0a4d45 54484f44 3a0a0a42 4c41434b 454e4544 20434142 4f204649 53482054 41434f53 

Любые идеи, как сделать это более надежным?

4b9b3361

Ответ 1

+stringWithUTF8String: будет считать, что его ввод является строкой с нулевым завершением, но NSData не помещает там никакого определенного терминатора. Вместо этого создайте свою строку с помощью -initWithBytes:length:encoding:, так как вы знаете длину данных.

Ответ 2

Имела ту же проблему, initWithData: данные работают для меня

- (NSString *)base64String {
    NSData * data = [UIImagePNGRepresentation(self) base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength];
    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}