Como converter um valor NSString para NSData?


Respostas:


1419
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];

Quais são os prós e os contras do uso de UTF-8 em oposição a algo mais alto como UTF-16 ou UTF-32?
Albert Renshaw

4
O NSData não liga muito para saber se é UTF-8 ou UTF-16 ou UTF-32. Há dois problemas: Um, UTF-16 e UTF-32 precisam ter a ordem de bytes correta. Dois, quem quer que o converta de volta para um NSString * deve conhecer a codificação e geralmente assumirá a codificação UTF-8. Geralmente, é mais provável que o UTF-8 seja tratado corretamente.
gnasher729

1
@ Bendytree, na verdade, não, -dataUsingEncoding: retornará uma string terminada não nula, que é o que stringWithUTF8String: requer, você tem limites para ler a memória que não deseja. O que o converte novamente é: -initWithData: encoding :.
Psycho

1
O @Albert Renshaw atualmente (não há garantia de que as coisas continuem assim) NSStringusa o UTF-16 internamente, portanto pode haver um pequeno ganho de desempenho, porque ele não precisa fazer uma conversão UTF-16 <-> UTF-8. Pessoalmente, preferimos (como @ gnasher729 sugere) a robustez ao desempenho e usamos o UTF-8 em qualquer lugar.
Some Developer

66
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

você pode consultar este link


3
Solução de um liner:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
Raptor

32

Faz:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

então fique à vontade para prosseguir NSJSONSerialization:JSONObjectWithData.


Correção da resposta referente ao terminador NULL

Após os comentários, a documentação oficial e as verificações , esta resposta foi atualizada com relação à remoção de um suposto terminador NULL:

  1. Conforme documentado por dataUsingEncoding ::

    Valor de retorno

    O resultado da chamada dataUsingEncoding:allowLossyConversion:com NO como o segundo argumento

  2. Conforme documentado por getCString: maxLength: encoding: e cStringUsingEncoding ::

    observe que os dados retornados por dataUsingEncoding:allowLossyConversion:não são uma string C estrita, pois não possuem um terminador NULL


14
Isto está errado! Por favor, veja o meu post aqui: stackoverflow.com/q/14087094/192819
jpswain

4
Sim. dataUsingEncoding:não retorna dados terminados em nulo. Somente UTF8Stringe outros métodos que retornam uma string C retornam uma string terminada em nulo.
Peter Hosey

@PeterHosey, você tem alguma fonte para isso? Estou tendo dificuldade para encontrar isso em qualquer documento.
shortstuffsushi

1
Graças @PeterHosey, os docs é ligada há que declarar explicitamente a falta de terminação NULL - (note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). Eu devo ter perdido isso antes. Certificarei de escrever qualquer coisa no futuro, no entanto.
Shortstuffsushi #

1
(Para quem está se perguntando: As citações de shortstuffsushi está sob cStringUsingEncoding:eu estava olhando para baixo. dataUsingEncoding:.)
Peter Hosey

20

No caso do Swift Developer chegar aqui,

converter de NSString / String para NSData

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

18

Objetivo-C:

NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];

Rápido:

let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String

Provavelmente muito do processador em comparação com os outros métodos, mas muito útil se você está acessando o sistema de arquivos para a persistência
Stephen J

10

Primeiro, você deve usar em dataUsingEncoding:vez de passar UTF8String. Você só usa UTF8Stringquando precisa de uma Csequência nessa codificação.

Então, UTF-16basta passar em NSUnicodeStringEncodingvez de NSUTF8StringEncodingna sua dataUsingEncoding:mensagem.


7

Para o Swift 3, você converterá principalmente de Stringpara Data.

let myString = "test"
let myData = myString.data(using: .utf8)
print(myData) // Optional(Data)

6
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];

5
Essa resposta está errada quando strcontém pontos de código maiores que 127. Isso ocorre porque str.lengthfornece o número de caracteres Unicode, não o número de bytes. Por exemplo, se strestiver @"にほんご", str.lengthfornece 4 enquanto str.UTF8Stringna verdade contém 12 bytes. Mesmo se você substituir str.lengthpor strlen(str.UTF8String), ainda estará errado no caso em que strcontenha o caractere NULL, como @"にほ\0んご".
24516 Pang

Um objeto NSData criado dessa maneira lança exceção quando usado com [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableLeaves error: & error];
Adobels

2

Objetivo-C:

NSString para NSData:

NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];

NSData para NSString:

NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];

Rápido:

String para dados:

var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)

Dados para String:

var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!

1
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];

0

Objetivo-C

NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];

Rápido

let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)
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.