การแปลง NSData เป็น NSString ใน Objective c


87

ฉันต้องการแปลง NSData เป็น NSString .. วิธีใดดีที่สุดในการดำเนินการนี้

ฉันใช้รหัสนี้ แต่สตริงสุดท้ายคืนค่า null

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

เมื่อฉันเห็นคอนโซลมันจะพิมพ์ null


@ นิก .... @ มาร์วิน: คุณเป็นคนเดียวกันหรือมาจากเครือข่ายเดียวกัน? ฉันเพียงแค่สงสัยว่าทำไมคุณไอเดนทิคอนจะตรงเดียวกัน
vikingosegundo

สตริงคืออะไร? หากคุณได้รับnilฉันเดาว่าข้อมูลของคุณไม่ใช่สตริง utf8 ที่ถูกต้อง?
deanWombourne

@vikingosegundo สำหรับข้อมูลชนิดของคุณฉันไม่ทราบว่า nik ...
Mehul Mistri

มันตลกมากเพราะมันไม่น่าเป็นไปได้อย่างยิ่ง แต่ยังคงเป็นไปได้
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
John Erck

ฉันใช้ตัวเลขใน lldb มิฉะนั้นมันไม่ได้ผล ขอบคุณ.
Okhan Okbay

1
หมายเหตุ: หากคุณไม่แน่ใจเกี่ยวกับประเภทการเข้ารหัสของคุณหรือหากไม่เหมือนกันเสมอไปแนวทางนี้จะดีสำหรับคุณ: stackoverflow.com/a/50691430/2057171
Albert Renshaw

94

ใช้โค้ดด้านล่าง

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

9
นี่จะไม่ให้สตริงที่ถูกต้อง
Mehul Mistri

3
NSASCIIStringEncodingถ้าไม่ได้ก็ไม่ได้ ดูคำตอบ felipesสำหรับการเข้ารหัสอื่น ๆ
vikingosegundo

สำหรับการเข้ารหัส NSUTF8StringEncoding นี้ให้ศูนย์
Shauket Sheikh

15

-[NSString initWithData:encoding]จะส่งคืนnilหากการเข้ารหัสที่ระบุไม่ตรงกับการเข้ารหัสของข้อมูล

ตรวจสอบให้แน่ใจว่าข้อมูลของคุณเข้ารหัสเป็น UTF-8 (หรือเปลี่ยน NSUTF8StringEncoding เป็นการเข้ารหัสใด ๆ ที่เหมาะสมกับข้อมูล)


ฉันแปลงรูปภาพเป็น NSdata และแปลง NSdata เป็น String อีกครั้งโดยใช้ NSUTF8StringEncoding แต่มันกำลังแสดงศูนย์
รามก

6
NSString *string = [NSString stringWithUTF8String:[Data bytes]];

1
สิ่งนี้ไม่ทำงานตามที่อธิบายไว้ [[NSString จัดสรร] initWithData: การเข้ารหัส head: NSUTF8StringEncoding] ทำงาน
Ryan Heitner



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

Objective C มีวิธีตรวจจับการเข้ารหัสสตริงที่ฝังอยู่ใน NSData ในตัว

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

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.