ฉันจะแปลงค่า NSString เป็น NSData ได้อย่างไร


คำตอบ:


1419
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];

ข้อดีและข้อเสียของการใช้ UTF-8 ต่างจากสิ่งที่สูงกว่าเช่น UTF-16 หรือ UTF-32 คืออะไร
Albert Renshaw

4
NSData ไม่สนใจมากนักว่าเป็น UTF-8 หรือ UTF-16 หรือ UTF-32 มีสองปัญหา: หนึ่ง UTF-16 และ UTF-32 จำเป็นต้องมีการสั่งซื้อไบต์ที่ถูกต้อง สองใครก็ตามที่แปลงกลับเป็น NSString * จะต้องรู้จักการเข้ารหัสและมักจะใช้การเข้ารหัส UTF-8 โดยทั่วไป UTF-8 มักถูกจัดการอย่างถูกต้อง
gnasher729

1
@bendytree จริง ๆ แล้วมันไม่เป็นเช่นนั้น -dataUsingEncoding: จะคืนค่าสตริงที่ไม่สิ้นสุดซึ่งเป็นสตริง stringWithUTF8String: ต้องการคุณ จำกัด ขอบเขตการอ่านหน่วยความจำที่คุณไม่ต้องการ สิ่งที่แปลงกลับมาคือ: -initWithData: encoding:
Psycho

1
@Albert Renshaw ปัจจุบัน (ไม่รับประกันว่าสิ่งนี้จะคงอยู่) NSStringใช้ UTF-16 ภายในเพื่อให้มีประสิทธิภาพเพิ่มขึ้นเล็กน้อยเนื่องจากไม่จำเป็นต้องแปลง UTF-16 <-> UTF-8 โดยส่วนตัวเราชอบ (ตามที่ @ gnasher729 แนะนำ) ความทนทานกว่าประสิทธิภาพและใช้ UTF-8 ได้ทุกที่
นักพัฒนาบางคน

66
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

คุณสามารถอ้างอิงจากลิงค์นี้


3
วิธีแก้ปัญหาหนึ่งซับ:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
Raptor

32

ทำ:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

NSJSONSerialization:JSONObjectWithDataแล้วรู้สึกฟรีเพื่อดำเนินการต่อไปด้วย


แก้ไขคำตอบเกี่ยวกับ NULL terminator

ตามความเห็นเอกสารทางการและการตรวจสอบคำตอบนี้ได้รับการปรับปรุงเกี่ยวกับการลบเทอร์มินัล NULL ที่ถูกกล่าวหา:

  1. ตามที่บันทึกไว้โดยdataUsingEncoding ::

    ส่งคืนค่า

    ผลลัพธ์ของการเรียกใช้dataUsingEncoding:allowLossyConversion:ด้วยไม่ใช่เป็นอาร์กิวเมนต์ที่สอง

  2. ตามที่บันทึกไว้โดยgetCString: maxLength: encoding:และcStringUsingEncoding ::

    โปรดทราบว่าข้อมูลที่ส่งคืนโดยdataUsingEncoding:allowLossyConversion:ไม่ใช่สายอักขระ C ที่เข้มงวดเนื่องจากไม่มีจุดสิ้นสุด NULL


14
นี่มันผิด! โปรดดูโพสต์ของฉันที่นี่: stackoverflow.com/q/14087094/192819
jpswain

4
ได้. dataUsingEncoding:ไม่ส่งคืนข้อมูลที่สิ้นสุดด้วยค่า null เฉพาะUTF8Stringและวิธีการอื่น ๆ ที่ส่งคืนสตริง C ส่งคืนสตริงที่สิ้นสุดด้วยค่า null
Peter Hosey

@PeterHosey คุณมีแหล่งที่มาเพื่ออะไร ฉันพบว่ามันยากในเอกสารใด ๆ
shortstuffsushi

1
ขอบคุณ @PeterHosey เอกสารที่คุณเชื่อมโยงมีไม่ชัดเจนรัฐขาดการเลิกจ้างเป็นโมฆะ (note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator)- ฉันต้องพลาดเรื่องนี้ไปก่อนหน้านี้ แม้ว่าฉันจะแน่ใจว่าจะเขียนอะไรในอนาคต
shortstuffsushi

1
(สำหรับทุกคนที่สงสัย: คำกล่าวของ shortstuffsushi อยู่ภายใต้cStringUsingEncoding:ฉันกำลังมองหาอยู่dataUsingEncoding:)
Peter Hosey

20

ในกรณีที่ Swift Developer มาที่นี่

การแปลงจาก NSString / String เป็น NSData

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

18

Objective-C:

NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];

สวิฟท์:

let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String

อาจเป็นตัวประมวลผลที่เข้มข้นมากเมื่อเทียบกับวิธีอื่น ๆ แต่มีประโยชน์มากถ้าคุณเข้าถึงระบบไฟล์เพื่อคงอยู่
Stephen J

10

ปิดครั้งแรกที่คุณควรใช้แทนจะผ่านdataUsingEncoding: UTF8Stringคุณใช้UTF8Stringเมื่อคุณต้องการCสตริงในการเข้ารหัสเท่านั้น

จากนั้นUTF-16เพียงแค่ส่งNSUnicodeStringEncodingแทนข้อความNSUTF8StringEncodingของคุณdataUsingEncoding:


7

สำหรับสวิฟท์ 3 ส่วนใหญ่คุณจะแปลงจากไปStringData

let myString = "test"
let myData = myString.data(using: .utf8)
print(myData) // Optional(Data)

6
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];

5
คำตอบนี้ไม่ถูกต้องเมื่อstrมีรหัสจุดที่ใหญ่กว่า 127 เนื่องจากstr.lengthเป็นจำนวนอักขระ Unicode ไม่ใช่จำนวนไบต์ ตัวอย่างเช่นถ้าstrเป็น@"にほんご", str.lengthให้ 4 ในขณะที่str.UTF8Stringจริงมี 12 ไบต์ แม้ว่าคุณจะแทนที่str.lengthโดยstrlen(str.UTF8String)มันจะยังคงไม่ถูกต้องสำหรับกรณีที่มีตัวอักษรเป็นโมฆะเช่นstr @"にほ\0んご"
ปาง

วัตถุ NSData ที่สร้างขึ้นด้วยวิธีนี้จะทำการยกเว้นเมื่อใช้กับ [NSJSONSerialization JSONObjectWithData: ตัวเลือกข้อมูล: ข้อผิดพลาด NSJSONReadingMutableLeaves: & error];
Adobels

2

Objective-C:

NSString ไปยัง NSData:

NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];

NSData ถึง NSString:

NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];

สวิฟท์:

สตริงกับข้อมูล:

var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)

Data to String:

var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!


0

Objective-C

NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];

รวดเร็ว

let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.