Conversión de NSData a NSString en Objective c

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 veo la consola, imprimirá nulo.

Los documentos para NSString dicen

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

Valor de retorno Un objeto NSString inicializado convirtiendo los bytes en datos en caracteres Unicode usando encoding. 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 encoding).

Deberías probar con otra encoding para ver si resuelve tu 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 }; 

Use el código a continuación.

 NSString* myString; myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding]; 

-[NSString initWithData:encoding] devolverá nil si la encoding especificada no coincide con la encoding de los datos.

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

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

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

en el objective C:

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

¿No está seguro del tipo de encoding de datos? ¡No hay problema!

Sin necesidad de conocer los posibles tipos de encoding, en los que los tipos de encoding incorrectos le darán nulo / nulo, esto debería abarcar todas sus bases:

 NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn]; 

¡Hecho!




Nota: En caso de que esto de alguna manera falle, puede descomprimir su NSData con NSKeyedUnarchiver , luego volver a NSKeyedUnarchiver el (id)unpacked nuevamente a través de NSKeyedArchiver , y ese formulario NSData debe ser codificado en base64.

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

C objective:

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

Rápido:

 let str = String(data: data, encoding: NSUTF8StringEncoding) 

Rápido:

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

o .utf8 o la encoding que corresponda