Преобразование NSData в NSString в Objective c

87

Я хочу преобразовать NSData в NSString .. Как лучше всего это сделать?

Я использую этот код, но последняя строка возвращает null

NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);

Когда я увижу консоль, она напечатает null.

Мехул Мистри
источник
@Nik .... @Marvin: Вы один и тот же человек или из одной сети? Мне просто интересно, почему у вас одинаковые идентификаторы .
vikingosegundo
Что за строка? Если вы получаете, nilто я думаю, ваши данные не являются действительной строкой utf8?
deanWombourne
@vikingosegundo Для вашей любезной информации, я не знаю,
Ник
это действительно смешно, поскольку крайне маловероятно. но все же возможно.
vikingosegundo

Ответы:

47

Документы для NSStringговорит

https://developer.apple.com/documentation/foundation/nsstring/1416374-initwithdata

Возвращаемое значение Объект NSString, инициализированный преобразованием байтов данных в символы Unicode с использованием кодировки. Возвращенный объект может отличаться от исходного получателя. Возвращает nil, если инициализация не удалась по какой-либо причине (например, если данные не представляют допустимые данные для кодирования).

Вы должны попробовать другую кодировку, чтобы проверить, решает ли она вашу проблему.

 // 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
};
Фелипе Сабино
источник
NSASCIIStringEncoding
Джон Эрк
Я использовал числа в lldb. В противном случае это не сработало. Спасибо.
Охан Окбай
1
Примечание: если вы не уверены в своем типе кодировки или если он не всегда один и тот же, этот подход будет вам полезен: stackoverflow.com/a/50691430/2057171
Альберт Реншоу
94

Используйте приведенный ниже код.

NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
Джалия
источник
9
это не даст мне правильную строку
Мехул Мистри
3
если нет, то это не так NSASCIIStringEncoding. другие кодировки см. в ответе felipes
vikingosegundo
Для этой кодировки NSUTF8StringEncoding дает nil
Шаукет Шейх
15

-[NSString initWithData:encoding]вернется, nilесли указанная кодировка не соответствует кодировке данных.

Убедитесь, что ваши данные закодированы в UTF-8 (или измените NSUTF8StringEncoding на любую кодировку, подходящую для данных).

Мортен Фаст
источник
Я преобразовал изображение в NSdata и снова преобразовал NSdata в String с помощью NSUTF8StringEncoding. Но он показывает ноль.
Рамакришна
6
NSString *string = [NSString stringWithUTF8String:[Data bytes]];
Наг Радж
источник
1
Это не работает, как описано [[NSString alloc] initWithData: head encoding: NSUTF8StringEncoding] работает
Райан Хейтнер
2

-[NSString initWithData:encoding] ваш друг, но только если вы используете правильную кодировку.

Билал Хан
источник
2

Цель C:

[[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];

Swift:

let str = String(data: data, encoding: .ascii)
Александр Волков
источник
1

Swift:

let jsonString = String(data: jsonData, encoding: .ascii)

или .utf8или любая другая подходящая кодировка

Джесс
источник
1

Не уверены в типе кодировки данных? Нет проблем!

Без необходимости знать потенциальные типы кодирования, в которых неправильные типы кодирования дадут вам nil / null, это должно охватывать все ваши основы:

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

Выполнено!




Примечание. Если это каким-то образом не удается, вы можете распаковать свои NSData с помощью , а NSKeyedUnarchiver затем (id)unpackedснова упаковать их через NSKeyedArchiverпереходное отверстие, и эта форма NSData должна быть кодируемой в формате base64.

id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];
Альберт Реншоу
источник
0

в объекте C:

NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)
Ашок Р
источник
это неверно, он вернет что-то вроде, {length = XX, bytes = 0xYYYYYYYY}и я предполагаю, что вопрос заключался в том, как развернуть закодированную строку из необработанных байтов, а не их описания
raistlin
0

Objective C включает встроенный способ обнаружения кодировки строки, встроенной в NSData.

NSData* data = // Assign your NSData object...

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
Эндрю Рондо
источник