Преобразование NSData в NSString в Object c
Я хочу преобразовать NSData в NSString. Каков наилучший способ сделать это?
Я использую этот код, но окончательная строка возвращает null
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
Когда я увижу консоль, он напечатает нуль.
Ответы
Ответ 1
Документы для NSString
говорят
https://developer.apple.com/documentation/foundation/nsstring/1416374-initwithdata
Возвращаемое значение Объект NSString инициализируется путем преобразования байтов в данных в символы Unicode, используя кодирование. Возвращаемый объект может быть отличается от оригинального приемника. Возвращает ноль, если инициализация по какой-либо причине (например, если данные не представляют действительные данные для кодирование).
Вы должны попробовать другую кодировку, чтобы проверить, разрешает ли она вашу проблему.
// The following constants are provided by NSString as possible string encodings.
enum {
NSASCIIStringEncoding = 1,
NSNEXTSTEPStringEncoding = 2,
NSJapaneseEUCStringEncoding = 3,
NSUTF8StringEncoding = 4,
NSISOLatin1StringEncoding = 5,
NSSymbolStringEncoding = 6,
NSNonLossyASCIIStringEncoding = 7,
NSShiftJISStringEncoding = 8,
NSISOLatin2StringEncoding = 9,
NSUnicodeStringEncoding = 10,
NSWindowsCP1251StringEncoding = 11,
NSWindowsCP1252StringEncoding = 12,
NSWindowsCP1253StringEncoding = 13,
NSWindowsCP1254StringEncoding = 14,
NSWindowsCP1250StringEncoding = 15,
NSISO2022JPStringEncoding = 21,
NSMacOSRomanStringEncoding = 30,
NSUTF16StringEncoding = NSUnicodeStringEncoding,
NSUTF16BigEndianStringEncoding = 0x90000100,
NSUTF16LittleEndianStringEncoding = 0x94000100,
NSUTF32StringEncoding = 0x8c000100,
NSUTF32BigEndianStringEncoding = 0x98000100,
NSUTF32LittleEndianStringEncoding = 0x9c000100,
NSProprietaryStringEncoding = 65536
};
Ответ 2
Используйте код ниже.
NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
Ответ 3
-[NSString initWithData:encoding]
вернет nil
, если указанная кодировка не соответствует кодировке данных.
Убедитесь, что ваши данные закодированы в UTF-8 (или измените NSUTF8StringEncoding на любую кодировку, соответствующую данным).
Ответ 4
NSString *string = [NSString stringWithUTF8String:[Data bytes]];
Ответ 5
-[NSString initWithData:encoding]
является вашим другом, но только при правильной кодировке.
Ответ 6
Цель C:
[[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
Swift:
let str = String(data: data, encoding: .ascii)
Ответ 7
в объекте C:
NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)
Ответ 8
Не уверены в типе кодировки данных? Нет проблем!
Без необходимости знать потенциальные типы кодирования, в которых неправильные типы кодирования будут давать вам ноль/ноль, это должно охватывать все ваши базы:
NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];
Готово!
Примечание. В случае неудачи вы можете распаковать NSData с помощью NSKeyedUnarchiver
, а затем повторно упаковать (id)unpacked
через NSKeyedArchiver
, и эта форма NSData должна быть закодирована в base64.
id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];
Ответ 9
Swift:
let jsonString = String(data: jsonData, encoding: .ascii)
или .utf8
или любого подходящего кодирования