Conversione di NSData in NSString in Objective c


87

Voglio convertire NSData in NSString. Qual è il modo migliore per farlo?

Sto usando questo codice ma la stringa finale restituisce null

NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);

Quando vedo la console, verrà stampato un valore nullo.


@Nik .... @Marvin: Sei la stessa persona o dalla stessa lan? Mi chiedo solo perché le tue identità sono esattamente le stesse.
vikingosegundo

Qual è la stringa? Se stai ottenendo, nilimmagino che i tuoi dati non siano una stringa utf8 valida?
deanWombourne

@vikingosegundo Per la tua gentile informazione non so nik ...
Mehul Mistri

è davvero divertente, poiché è estremamente improbabile. ma ancora possibile.
vikingosegundo

Risposte:


47

I documenti per NSStringdice

https://developer.apple.com/documentation/foundation/nsstring/1416374-initwithdata

Valore restituito Un oggetto NSString inizializzato convertendo i byte nei dati in caratteri Unicode utilizzando la codifica. L'oggetto restituito potrebbe essere diverso dal destinatario originale. Restituisce zero se l'inizializzazione fallisce per qualche motivo (ad esempio se i dati non rappresentano dati validi per la codifica).

Dovresti provare altre codifiche per verificare se risolve il tuo problema

 // The following constants are provided by NSString as possible string encodings.
enum {
   NSASCIIStringEncoding = 1,
   NSNEXTSTEPStringEncoding = 2,
   NSJapaneseEUCStringEncoding = 3,
   NSUTF8StringEncoding = 4,
   NSISOLatin1StringEncoding = 5,
   NSSymbolStringEncoding = 6,
   NSNonLossyASCIIStringEncoding = 7,
   NSShiftJISStringEncoding = 8,
   NSISOLatin2StringEncoding = 9,
   NSUnicodeStringEncoding = 10,
   NSWindowsCP1251StringEncoding = 11,
   NSWindowsCP1252StringEncoding = 12,
   NSWindowsCP1253StringEncoding = 13,
   NSWindowsCP1254StringEncoding = 14,
   NSWindowsCP1250StringEncoding = 15,
   NSISO2022JPStringEncoding = 21,
   NSMacOSRomanStringEncoding = 30,
   NSUTF16StringEncoding = NSUnicodeStringEncoding,
   NSUTF16BigEndianStringEncoding = 0x90000100,
   NSUTF16LittleEndianStringEncoding = 0x94000100,
   NSUTF32StringEncoding = 0x8c000100,
   NSUTF32BigEndianStringEncoding = 0x98000100,
   NSUTF32LittleEndianStringEncoding = 0x9c000100,
   NSProprietaryStringEncoding = 65536
};

NSASCIIStringEncoding
John Erck

Ho usato i numeri in lldb. Altrimenti non ha funzionato. Grazie.
Okhan Okbay

1
Nota: se non sei sicuro del tuo tipo di codifica o se non è sempre lo stesso, questo approccio andrà bene per te: stackoverflow.com/a/50691430/2057171
Albert Renshaw


15

-[NSString initWithData:encoding]restituirà nilse la codifica specificata non corrisponde alla codifica dei dati.

Assicurati che i tuoi dati siano codificati in UTF-8 (o cambia NSUTF8StringEncoding con qualsiasi codifica appropriata per i dati).


Ho convertito un'immagine in NSdata e di nuovo convertito NSdata in String utilizzando NSUTF8StringEncoding. Ma sta mostrando zero.
Ramakrishna

6
NSString *string = [NSString stringWithUTF8String:[Data bytes]];

1
Questo non funziona come descritto [[NSString alloc] initWithData: head encoding: NSUTF8StringEncoding] funziona
Ryan Heitner

2

-[NSString initWithData:encoding] è tuo amico ma solo quando usi una codifica corretta.


2

Obiettivo C:

[[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];

Swift:

let str = String(data: data, encoding: .ascii)

1

Swift:

let jsonString = String(data: jsonData, encoding: .ascii)

o .utf8qualsiasi altra codifica appropriata


1

Non sei sicuro del tipo di codifica dei dati? Nessun problema!

Senza bisogno di conoscere i potenziali tipi di codifica, in cui tipi di codifica sbagliati ti daranno zero / null, questo dovrebbe coprire tutte le tue basi:

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

Fatto!




Nota: nel caso in cui ciò in qualche modo fallisca, puoi decomprimere il tuo NSData con NSKeyedUnarchiver , quindi reimballare di (id)unpackednuovo via NSKeyedArchivere quel modulo NSData dovrebbe essere codificabile in base64.

id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];

0

nell'obiettivo C:

NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)

questo è sbagliato, restituirà qualcosa di simile {length = XX, bytes = 0xYYYYYYYY}e presumo che la domanda fosse come scartare una stringa codificata da byte grezzi, non la loro descrizione
raistlin

0

L'obiettivo C include un modo integrato per rilevare la codifica di una stringa incorporata in NSData.

NSData* data = // Assign your NSData object...

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
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.