Convertendo NSData em NSString no Objective c

87

Quero converter NSData em NSString ... Qual é a melhor maneira de fazer isso?

Estou usando este código, mas a string final retorna nulo

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

Quando vejo o console, ele imprime nulo.

Mehul Mistri
fonte
@Nik .... @Marvin: Você é a mesma pessoa ou é da mesma LAN? Eu só me pergunto por que suas identificações são exatamente as mesmas.
vikingosegundo
Qual é a corda? Se você está recebendo, nilentão eu acho que seus dados não são uma string utf8 válida?
deanWombourne de
@vikingosegundo Para sua informação, eu não sei nik ...
Mehul Mistri
isso é muito engraçado, pois é extremamente improvável. mas ainda possível.
vikingosegundo

Respostas:

47

A documentação para NSStringdiz

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

Valor de retorno Um objeto NSString inicializado convertendo os bytes nos dados em caracteres Unicode usando codificação. O objeto retornado pode ser diferente do receptor original. Retorna nil se a inicialização falhar por algum motivo (por exemplo, se os dados não representam dados válidos para codificação).

Você deve tentar outra codificação para verificar se ela resolve o seu 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
fonte
NSASCIIStringEncoding
John Erck de
Usei os números em lldb. Caso contrário, não funcionou. Obrigado.
Okhan Okbay
1
Observação: se você não tiver certeza do seu tipo de codificação ou se nem sempre for o mesmo, esta abordagem será boa para você: stackoverflow.com/a/50691430/2057171
Albert Renshaw
94

Use o código abaixo.

NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
Jhaliya
fonte
9
isso não vai me dar a string adequada
Mehul Mistri
3
se não, não é NSASCIIStringEncoding. veja a resposta de felipes para outras codificações
vikingosegundo
Para esta codificação NSUTF8StringEncoding dando nulo
Shauket Sheikh
15

-[NSString initWithData:encoding]retornará nilse a codificação especificada não corresponder à codificação dos dados.

Certifique-se de que seus dados estejam codificados em UTF-8 (ou altere NSUTF8StringEncoding para qualquer codificação apropriada para os dados).

Morten Fast
fonte
Converti uma imagem em NSdata e novamente convertendo o NSdata em String usando o NSUTF8StringEncoding. Mas não está mostrando nada.
Ramakrishna,
6
NSString *string = [NSString stringWithUTF8String:[Data bytes]];
Nag Raj
fonte
1
Isso não funciona conforme descrito [[NSString alloc] initWithData: head encoding: NSUTF8StringEncoding] funciona
Ryan Heitner
2

-[NSString initWithData:encoding] é seu amigo, mas apenas quando você usa uma codificação adequada.

Bilal Khan
fonte
2

Objetivo C:

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

Rápido:

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

Rápido:

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

ou .utf8ou qualquer codificação apropriada

Jess
fonte
1

Não tem certeza do tipo de codificação dos dados? Sem problemas!

Sem a necessidade de conhecer os tipos de codificação potenciais, nos quais os tipos de codificação incorretos resultarão em nil / null, isso deve abranger todas as suas bases:

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

Feito!




Observação: no caso de falha de alguma forma, você pode descompactar seu NSData com e NSKeyedUnarchiver , em seguida, empacotar (id)unpackednovamente via NSKeyedArchiver, e esse formulário NSData deve ser codificado em base64.

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

no objetivo C:

NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)
Ashok R
fonte
este está errado, ele retornará algo como {length = XX, bytes = 0xYYYYYYYY}e suponho que a pergunta era como desembrulhar string codificada de bytes brutos, não sua descrição
raistlin
0

Objective C inclui uma maneira embutida de detectar a codificação de uma string embutida em NSData.

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

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