Làm cách nào để chuyển đổi giá trị NSString thành NSData?


Câu trả lời:


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

Những ưu và nhược điểm của việc sử dụng UTF-8 trái ngược với những thứ cao hơn như UTF-16 hoặc UTF-32 là gì?
Albert Renshaw

4
NSData không quan tâm nhiều đến việc đó là UTF-8 hay UTF-16 hay UTF-32. Có hai vấn đề: Một, UTF-16 và UTF-32 cần phải có thứ tự byte đúng. Hai, bất cứ ai chuyển đổi nó trở lại thành NSString * đều phải biết mã hóa và thường sẽ sử dụng mã hóa UTF-8. Nói chung, UTF-8 rất có thể được xử lý chính xác.
gnasher729

1
@bendytree thực sự là không, -dataUsingEncoding: sẽ trả về một chuỗi không kết thúc, đó là chuỗi màWithUTF8String: yêu cầu, bạn giới hạn để đọc bộ nhớ mà bạn không muốn. Những gì chuyển đổi trở lại là: -initWithData: mã hóa :.
Tâm lý

1
@Albert Renshaw hiện tại (không đảm bảo mọi thứ theo cách này) NSStringsử dụng UTF-16 trong nội bộ để có thể tăng hiệu suất nhẹ vì không phải thực hiện chuyển đổi UTF-16 <-> UTF-8. Cá nhân, chúng tôi thích (như @ gnasher729 gợi ý) sự mạnh mẽ hơn hiệu suất và sử dụng UTF-8 ở mọi nơi.
Một số nhà phát triển

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

bạn có thể tham khảo từ liên kết này


3
Một giải pháp lót:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
Raptor

32

Làm:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

sau đó cảm thấy tự do để tiến hành NSJSONSerialization:JSONObjectWithData.


Sửa lỗi cho câu trả lời liên quan đến bộ kết thúc NULL

Sau các bình luận, tài liệu chính thức và xác minh , câu trả lời này đã được cập nhật liên quan đến việc loại bỏ một kẻ hủy diệt NULL bị cáo buộc:

  1. Theo tài liệu của dataUsingEncoding ::

    Giá trị trả lại

    Kết quả của việc gọi dataUsingEncoding:allowLossyConversion:với NO là đối số thứ hai

  2. Theo tài liệu của getCString: maxLạng: mã hóa:cStringUsingEncoding ::

    lưu ý rằng dữ liệu được trả về dataUsingEncoding:allowLossyConversion:không phải là một chuỗi C nghiêm ngặt vì nó không có bộ kết thúc NULL


14
Cái này sai! Vui lòng xem bài viết của tôi ở đây: stackoverflow.com/q/14087094/192819
jpswain

4
Vâng dataUsingEncoding:không trả về dữ liệu kết thúc null. Chỉ UTF8Stringvà các phương thức khác trả về chuỗi C trả về chuỗi kết thúc null.
Peter Hosey

@PeterHosey bạn có nguồn nào cho việc đó không? Tôi đang có một thời gian khó khăn để tìm thấy điều đó trong bất kỳ tài liệu.
shortthingsushi

1
Cảm ơn @PeterHosey, các tài liệu bạn liên kết có làm rõ ràng nhà nước thiếu chấm dứt NULL - (note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). Tôi đã phải bỏ lỡ điều này sớm hơn. Tuy nhiên, tôi chắc chắn sẽ viết bất cứ điều gì trong tương lai.
shortthingsushi

1
(Đối với bất cứ ai thắc mắc: trích dẫn của short waresushi cStringUsingEncoding:. Tôi đang tìm kiếm dataUsingEncoding:.)
Peter Hosey

20

Trong trường hợp Swift Developer đến đây,

để chuyển đổi từ NSString / String sang NSData

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

18

Mục tiêu-C:

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

Nhanh:

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

Có thể sử dụng nhiều bộ xử lý so với các phương pháp khác, nhưng rất hữu ích nếu bạn đang truy cập hệ thống tệp để duy trì
Stephen J

10

Trước hết, bạn nên sử dụng dataUsingEncoding:thay vì đi qua UTF8String. Bạn chỉ sử dụng UTF8Stringkhi bạn cần một Cchuỗi trong mã hóa đó.

Sau đó, cho UTF-16, chỉ cần vượt qua NSUnicodeStringEncodingthay vì NSUTF8StringEncodingtrong dataUsingEncoding:tin nhắn của bạn .


7

Đối với Swift 3, bạn sẽ chủ yếu chuyển đổi từ Stringsang Data.

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
Câu trả lời này sai khi strchứa các điểm mã lớn hơn 127. Điều này là do str.lengthđưa ra số lượng ký tự Unicode, không phải số byte. Ví dụ, nếu str@"にほんご", str.lengthcho 4 trong khi str.UTF8Stringthực sự chứa 12 byte. Ngay cả khi bạn thay thế str.lengthbằng strlen(str.UTF8String), nó vẫn sẽ sai đối với trường hợp strchứa ký tự NULL, chẳng hạn như @"にほ\0んご".
Pang

Một đối tượng NSData được tạo theo cách này sẽ loại bỏ sự miễn trừ khi sử dụng với [NSJSONSerialization JSONObjectWithData: tùy chọn dữ liệu: NSJSONReadMutableLeaves error: & error];
Adobels

2

Mục tiêu-C:

NSString đến NSData:

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

NSData đến NSString:

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

Nhanh:

Chuỗi dữ liệu:

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

Dữ liệu thành chuỗi:

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

1
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];

0

Mục tiêu-C

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

Nhanh

let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.