Bagaimana cara mengonversi nilai NSString ke NSData?


Jawaban:


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

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


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


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)

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

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 .


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)

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

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!

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

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.