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.


@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
};

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


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).


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]];

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.


2

C objetivo:

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

Rápido:

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

1

Rápido:

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

o .utf8cualquier codificación apropiada


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];

0

en el objetivo C:

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

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];
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.