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.