Conversión de NSData a NSString en Objective c

87

Quiero convertir NSData a NSString ... ¿Cuál es la mejor manera de hacer esto?

Estoy usando este código pero la cadena final devuelve nulo

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

Cuando vea la consola, se imprimirá nulo.

Mehul Mistri
fuente
@Nik .... @Marvin: ¿Eres la misma persona o de la misma lengua? Me pregunto por qué sus identicons son exactamente iguales.
vikingosegundo
¿Qué es la cuerda? Si lo está recibiendo nil, ¿supongo que sus datos no son una cadena utf8 válida?
deanWombourne
@vikingosegundo Para su amable información, no sé nik ...
Mehul Mistri
eso es realmente divertido, ya que es extremadamente improbable. pero aún posible.
vikingosegundo

Respuestas:

47

Los documentos para NSStringdice

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

Valor de retorno Un objeto NSString inicializado al convertir los bytes de los datos en caracteres Unicode mediante codificación. El objeto devuelto puede ser diferente del receptor original. Devuelve nil si la inicialización falla por algún motivo (por ejemplo, si los datos no representan datos válidos para la codificación).

Debería probar otra codificación para verificar si resuelve su 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
};
Felipe Sabino
fuente
NSASCIIStringEncoding
John Erck
Usé los números en lldb. De lo contrario, no funcionó. Gracias.
Okhan Okbay
1
Nota: Si no está seguro de su tipo de codificación o si no siempre es el mismo, este enfoque será bueno para usted: stackoverflow.com/a/50691430/2057171
Albert Renshaw
94

Utilice el siguiente código.

NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
Jhaliya
fuente
9
esto no me dará la cadena adecuada
Mehul Mistri
3
si no, no lo es NSASCIIStringEncoding. ver la respuesta de felipes para otras codificaciones
vikingosegundo
Para esta codificación NSUTF8StringEncoding dando nil
Shauket Sheikh
15

-[NSString initWithData:encoding]devolverá nilsi la codificación especificada no coincide con la codificación de los datos.

Asegúrese de que sus datos estén codificados en UTF-8 (o cambie NSUTF8StringEncoding a cualquier codificación que sea apropiada para los datos).

Morten Fast
fuente
Convertí una imagen en NSdata y nuevamente convertí NSdata en String usando NSUTF8StringEncoding. Pero se muestra nulo.
Ramakrishna
6
NSString *string = [NSString stringWithUTF8String:[Data bytes]];
Nag Raj
fuente
1
Esto no funciona como se describe [[NSString alloc] initWithData: head encoding: NSUTF8StringEncoding] funciona
Ryan Heitner
2

-[NSString initWithData:encoding] es tu amigo, pero solo cuando usas una codificación adecuada.

Bilal Khan
fuente
2

C objetivo:

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

Rápido:

let str = String(data: data, encoding: .ascii)
Alexander Volkov
fuente
1

Rápido:

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

o .utf8cualquier codificación apropiada

Cadena
fuente
1

¿No estás seguro del tipo de codificación de los datos? ¡No hay problema!

Sin necesidad de conocer los tipos de codificación potenciales, en los que los tipos de codificación incorrectos le darán nulo / nulo, esto debería cubrir todas sus bases:

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

¡Hecho!




Nota: En caso de que esto falle de alguna manera, puede desempaquetar su NSData con NSKeyedUnarchiver , luego volver a empaquetarlo de (id)unpackednuevo a través NSKeyedArchiver, y ese formulario NSData debe ser codificable en base64.

id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];
Albert Renshaw
fuente
0

en el objetivo C:

NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)
Ashok R
fuente
este es incorrecto, devolverá algo como {length = XX, bytes = 0xYYYYYYYY}y supongo que la pregunta fue cómo desenvolver una cadena codificada de bytes sin procesar, no su descripción
raistlin
0

Objective C incluye una forma incorporada de detectar la codificación de una cadena incrustada en NSData.

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

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
Andrew Rondeau
fuente