2012-04-16 18 views
13

Ho cercato. Ma ancora non riuscivo a capirlo.NSData to NSString restituisce Null

Sto convertendo NSdata in NSString. Quando faccio [data description]; mi restituisce < 00000000 31323334 35363738> Sì, sto ricevendo la mia stringa @ "12345678".

Come si converte in NSString in modo appropriato? Ho provato

NSString *b = [NSString stringWithUTF8String:[data bytes]]; 
NSString *a = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding]; 

Sia restituisce me nulla. Qualche idea? Grazie

Ciao a tutti, Grazie per tutti i suggerimenti. Sembra essere costante per cui c'è sempre un carattere nullo di fronte. Quindi ogni volta che ricevo qualcosa, rimuovo solo il primo < 00000000>, quindi funziona correttamente già

+0

Una ricerca in SO ti darà la risposta – SomaMan

+0

Ciao, come posso accettare la risposta della gente? Ho provato a fare clic sul tasto Su ma dice che ho bisogno di più di 15 reputazione – user774150

risposta

26

Ciò accade se la codifica non è corretta.

Provare a utilizzare ASCII per eseguire il test. ASCII quasi sicuramente funziona per recuperare qualche tipo di corda. Se sono solo numeri, probabilmente funzionerà.

NSString *a = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSASCIIStringEncoding]; 

più comune, tranne il circuito di codifica UTF-8 è:

NSASCIIStringEncoding 
NSUnicodeStringEncoding 
NSISOLatin1StringEncoding 
NSISOLatin2StringEncoding 
NSSymbolStringEncoding 

loro cercano fuori e vedere se funzionano.

+1

NSASCIIStringEncoding ha funzionato per me. Grazie. –

6

Sto convertendo NSdata in NSString. Quando faccio [descrizione dei dati]; it restituisce < 00000000 31323334 35363738> Sì, sto ricevendo la mia stringa @ "12345678".

No, non si riceve quella stringa. Si sta ricevendo una sequenza di byte che inizia con un gruppo di valori 0x00 ed è seguita da una serie di byte che corrispondono alla sequenza ASCII "12345678".

I.e. hai dati grezzi e stai provando a convertirli in un tipo vincolato, ma non puoi perché il tipo vincolato non può rappresentare i dati grezzi.

Si potrebbe provare a utilizzare le API "lossy conversion" su NSString, ma ciò potrebbe non funzionare e sarebbe comunque fragile.

La migliore scommessa?

Converti solo i byte negli NSData che rappresentano effettivamente la stringa in un'istanza di NSString. Questo può essere fatto con -initWithBytes:length:encoding:; dovrai eseguire i calcoli per trovare l'offset e la lunghezza corretti.

2

Ciò può essere dovuto al fatto che i primi byte dei dati sono 00. Il carattere 0 è la fine del carattere di stringa. Quando si crea una stringa da ASCII (da una matrice di caratteri o una matrice di byte come si fa), quando si incontra il carattere 0 all'inizio, produce una stringa vuota.

Tuttavia, mi aspetto di restituire un'istanza di NSString con 0 caratteri e non null.

+1

Il fatto che una stringa sia terminata con '0x00' è vero solo se è una stringa C. Per altri tipi di stringhe, sono spesso rappresentati come tripla di codifica, lunghezza e dati. Questo è il caso di NSString; Le 0x00 non stanno inducendo a pensare che la stringa sia terminata, stanno innescando un errore perché 0x00 è una sequenza di byte priva di significato all'interno di una stringa. – bbum