Bagaimana cara mengonversi nilai NSString ke NSData?

Jawaban:

1419
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
flitzwald
sumber
Apa pro dan kontra menggunakan UTF-8 sebagai lawan dari sesuatu yang lebih tinggi seperti UTF-16 atau UTF-32?
Albert Renshaw
4
NSData tidak terlalu peduli apakah itu UTF-8 atau UTF-16 atau UTF-32. Ada dua masalah: Satu, UTF-16 dan UTF-32 harus memiliki pemesanan byte yang tepat. Dua, siapa pun yang mengonversinya kembali ke NSString * harus mengetahui penyandian, dan seringkali akan menganggap penyandian UTF-8. Secara umum, UTF-8 kemungkinan besar akan ditangani dengan benar.
gnasher729
1
@ bendytree sebenarnya tidak, -dataUsingEncoding: akan mengembalikan string yang tidak diakhiri dengan null yang merupakan stringWithUTF8String: mengharuskan, Anda harus membaca memori yang tidak Anda inginkan. Apa yang mengubahnya kembali adalah: -initWithData: encoding :.
Psiko
1
@Albert Renshaw saat ini (tidak ada jaminan akan tetap seperti ini) NSStringmenggunakan UTF-16 secara internal sehingga mungkin ada sedikit peningkatan kinerja karena tidak harus melakukan konversi UTF-16 <-> UTF-8. Secara pribadi, kami lebih suka (seperti yang disarankan @ gnasher729) daripada kinerja dan menggunakan UTF-8 di mana-mana.
Some Developer
66
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

Anda dapat mengambil referensi dari tautan ini

ALOK KUMAR
sumber
3
Satu solusi liner:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
Raptor
32

Melakukan:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

maka jangan ragu untuk melanjutkan NSJSONSerialization:JSONObjectWithData.


Koreksi jawaban terkait terminator NULL

Mengikuti komentar, dokumentasi resmi, dan verifikasi , jawaban ini diperbarui sehubungan dengan penghapusan dugaan terminator NULL:

  1. Seperti yang didokumentasikan oleh dataUsingEncoding ::

    Nilai Pengembalian

    Hasil dari pemanggilan dataUsingEncoding:allowLossyConversion:dengan NO sebagai argumen kedua

  2. Seperti yang didokumentasikan oleh getCString: maxLength: encoding: and cStringUsingEncoding ::

    perhatikan bahwa data yang dikembalikan oleh dataUsingEncoding:allowLossyConversion:bukan string-C yang ketat karena tidak memiliki terminator NULL

Andrew Kolesnikov
sumber
14
Ini salah! Silakan lihat posting saya di sini: stackoverflow.com/q/14087094/192819
jpswain
4
Ya. dataUsingEncoding:tidak mengembalikan data yang dihentikan nol. Hanya UTF8Stringdan metode lain yang mengembalikan string C mengembalikan string yang diakhiri null.
Peter Hosey
@ PeterHosey apakah Anda punya sumber untuk itu? Saya kesulitan menemukan itu di dokumen mana pun.
shortstuffsushi
1
Terima kasih @PeterHosey, docs Anda terhubung ada yang secara eksplisit menyatakan kurangnya NULL pemutusan - (note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). Saya pasti melewatkan ini sebelumnya. Saya pasti akan menulis apa pun di masa depan.
shortstuffsushi
1
(Untuk siapa pun yang bertanya-tanya: kutipan shortstuffsushi berada di bawah cStringUsingEncoding:. Saya mencari di bawah dataUsingEncoding:.)
Peter Hosey
20

Seandainya Pengembang Swift datang ke sini,

untuk mengkonversi dari NSString / String ke NSData

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
Sruit A.Suk
sumber
18

Tujuan-C:

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

Cepat:

let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String
Shamsiddin
sumber
Mungkin prosesor-intensif dibandingkan dengan metode lain, tetapi sangat berguna jika Anda mengakses sistem file untuk kegigihan
Stephen J
10

Pertama, Anda harus menggunakan dataUsingEncoding:alih-alih melalui UTF8String. Anda hanya menggunakan UTF8Stringsaat Anda membutuhkan Cstring dalam pengkodean itu.

Kemudian, untuk UTF-16, hanya lewat NSUnicodeStringEncodingalih-alih NSUTF8StringEncodingdalam dataUsingEncoding:pesan Anda .

Jerry Thomsan
sumber
7

Untuk Swift 3, Anda sebagian besar akan mengkonversi dari Stringmenjadi Data.

let myString = "test"
let myData = myString.data(using: .utf8)
print(myData) // Optional(Data)
jacks205
sumber
6
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
Nex Mishra
sumber
5
Jawaban ini salah ketika strberisi poin kode lebih besar dari 127. Ini karena str.lengthmemberikan jumlah karakter Unicode, bukan jumlah byte. Misalnya, jika stradalah @"にほんご", str.lengthmemberikan 4 sementara str.UTF8Stringsebenarnya mengandung 12 byte. Meskipun Anda menggantinya str.lengthdengan strlen(str.UTF8String), itu akan tetap salah untuk kasus di mana strberisi karakter NULL, seperti @"にほ\0んご".
Pang
Objek NSData yang dibuat dengan cara ini membuang pengecualian saat menggunakan dengan [NSJOpemeriksaan JSONObjectWithData: opsi data: NSJSONReadingMutableLeaves error: & error];
Adobels
2

Tujuan-C:

NSString ke NSData:

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

NSData ke NSString:

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

Cepat:

String ke Data:

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

Data ke String:

var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!
Nick
sumber
1
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
Kamani Jasmin
sumber
0

Objektif-C

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

Cepat

let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)
Rohit Makwana
sumber