Come posso convertire un valore NSString in NSData?


Risposte:


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

Quali sono i pro e i contro dell'utilizzo di UTF-8 rispetto a qualcosa di più elevato come UTF-16 o UTF-32?
Albert Renshaw,

4
NSData non si preoccupa molto se si tratta di UTF-8 o UTF-16 o UTF-32. Esistono due problemi: uno, UTF-16 e UTF-32 devono avere l'ordinamento byte corretto. Due, chiunque lo converta in NSString * deve conoscere la codifica e spesso assumerà la codifica UTF-8. In genere, è più probabile che UTF-8 venga gestito correttamente.
gnasher729,

1
@bendytree attualmente no, -dataUsingEncoding: restituirà una stringa senza terminazione null che è ciò che stringWithUTF8String: richiede, sei obbligato a leggere la memoria che non vuoi. Ciò che lo converte indietro è: -initWithData: encoding :.
Psycho,

1
@Albert Renshaw attualmente (nessuna garanzia di cose che restano in questo modo) NSStringutilizza UTF-16 internamente, quindi potrebbe esserci un leggero aumento delle prestazioni perché non deve eseguire una conversione UTF-16 <-> UTF-8. Personalmente, preferiamo (come suggerisce @ gnasher729) la robustezza rispetto alle prestazioni e usiamo UTF-8 ovunque.
Alcuni sviluppatori il

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

puoi prendere riferimento da questo link


3
Una soluzione di rivestimento:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
Raptor,

32

Fare:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

quindi sentiti libero di procedere NSJSONSerialization:JSONObjectWithData.


Correzione della risposta relativa al terminatore NULL

A seguito dei commenti, della documentazione ufficiale e delle verifiche , questa risposta è stata aggiornata per quanto riguarda la rimozione di un presunto terminatore NULL:

  1. Come documentato da dataUsingEncoding ::

    Valore di ritorno

    Il risultato dell'invocazione dataUsingEncoding:allowLossyConversion:con NO come secondo argomento

  2. Come documentato da getCString: maxLength: encoding: e cStringUsingEncoding ::

    si noti che i dati restituiti da dataUsingEncoding:allowLossyConversion:non sono una stringa C rigorosa poiché non hanno un terminatore NULL


14
Questo è sbagliato! Si prega di vedere il mio post qui: stackoverflow.com/q/14087094/192819
jpswain

4
Sì. dataUsingEncoding:non restituisce dati con terminazione null. Solo UTF8Stringe altri metodi che restituiscono una stringa C restituiscono una stringa con terminazione null.
Peter Hosey,

@PeterHosey hai qualche fonte per questo? Sto facendo fatica a trovarlo in tutti i documenti.
shortstuffsushi,

1
Grazie @PeterHosey, i documenti si è collegato ci fanno dichiarare esplicitamente la mancanza di terminazione NULL - (note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). Devo averlo perso prima. Sarò sicuro di scrivere qualsiasi cosa in futuro, però.
shortstuffsushi,

1
(Per chiunque si stia chiedendo: la citazione di shortstuffsushi è sotto cStringUsingEncoding:. Stavo guardando sotto dataUsingEncoding:.)
Peter Hosey,

20

Nel caso in cui Swift Developer venga qui,

per convertire da NSString / String a NSData

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

18

Objective-C:

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

Swift:

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

Probabilmente ad alta intensità di processore rispetto agli altri metodi, ma molto utile se si accede al file system per la persistenza
Stephen J,

10

Prima di tutto, dovresti usare dataUsingEncoding:invece di passare attraverso UTF8String. Si utilizza solo UTF8Stringquando è necessaria una Cstringa in tale codifica.

Quindi, per UTF-16, basta passare NSUnicodeStringEncodinginvece che NSUTF8StringEncodingnel tuo dataUsingEncoding:messaggio.


7

Per Swift 3, ti convertirai principalmente da Stringa 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
Questa risposta è errata quando strcontiene punti di codice maggiori di 127. Questo perché str.lengthfornisce il numero di caratteri Unicode, non il numero di byte. Ad esempio, se lo strè @"にほんご", str.lengthdà 4 mentre in str.UTF8Stringrealtà contiene 12 byte. Anche se lo sostituisci str.lengthcon strlen(str.UTF8String), sarà comunque sbagliato nel caso in cui strcontenga il carattere NULL, ad esempio @"にほ\0んご".
Ha

Un oggetto NSData creato in questo modo genera eccezioni quando si utilizza con [NSJSONSerialization JSONObjectWithData: opzioni dati: NSJSONReadingMutableLeaves error: & error];
Adobels,

2

Objective-C:

Da NSString a NSData:

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

NSData a NSString:

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

Swift:

String to Data:

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

Dati su stringa:

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

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

0

Objective-C

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

veloce

let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.