Перетворення NSData в NSString у цілі c


87

Я хочу перетворити NSData на NSString .. Який найкращий спосіб це зробити?

Я використовую цей код, але остаточний рядок повертає null

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

Коли я бачу консоль, вона надрукує нуль.


@Nik .... @Marvin: Ви одна і та сама людина або зсередини одного і того ж ланцюга? Мені просто цікаво, чому ваші ідентичні дані абсолютно однакові.
vikingosegundo

Що це за рядок? Якщо ви отримуєте, nilтоді я думаю, ваші дані не є дійсним рядком utf8?
deanWombourne

@vikingosegundo Для вашої доброї інформації я не знаю
ніка

це насправді смішно, оскільки це надзвичайно малоймовірно. але все-таки можливо.
vikingosegundo

Відповіді:


47

Документи для 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
};

NSASCIIStringEncoding
Джон Ерк,

Я використовував цифри в lldb. В іншому випадку це не спрацювало. Дякую.
Охан Окбай

1
Примітка: Якщо ви не впевнені у своєму типі кодування або якщо він не завжди однаковий, цей підхід буде для вас хорошим: stackoverflow.com/a/50691430/2057171
Альберт Реншоу,

94

Використовуйте код нижче.

NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];

9
це не дасть мені належної струни
Мехул Містрі

3
якщо ні, то ні NSASCIIStringEncoding. див. відповідь Феліпеса для інших кодувань
vikingosegundo

Для цього кодування NSUTF8StringEncoding дає нуль
Shauket Sheikh

15

-[NSString initWithData:encoding]повернеться, nilякщо вказане кодування не відповідає кодуванню даних.

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


Я перетворив зображення в NSdata і знову перетворив NSdata в String за допомогою NSUTF8StringEncoding. Але це показує нуль.
Рамакрішна


2

-[NSString initWithData:encoding] є вашим другом, але лише тоді, коли ви використовуєте належне кодування.



1

Стрімкий:

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

або .utf8будь-яке відповідне кодування


1

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

Без необхідності знати потенційні типи кодування, при яких неправильні типи кодування дадуть вам нуль / нуль, це повинно охоплювати всі ваші основи:

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

Завдання C включає вбудований спосіб виявлення кодування рядка, вбудованого в NSData.

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

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.