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.


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

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


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


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

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.


2

Objetivo C:

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

ou .utf8ou qualquer codificação apropriada


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

0

no objetivo C:

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

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];
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.