¿Cómo convierto un valor NSString a NSData?

¿Cómo convierto un NSString valor para NSData?

preguntado el 23 de mayo de 09 a las 08:05

11 Respuestas

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

Respondido 05 ago 12, 16:08

¿Cuáles son los pros y los contras de usar UTF-8 en lugar de algo superior como UTF-16 o UTF-32? - alberto renshaw

A NSData no le importa mucho si es UTF-8, UTF-16 o UTF-32. Hay dos problemas: uno, UTF-16 y UTF-32 necesitan tener el orden de bytes correcto. Dos, quien lo convierta de nuevo a un NSString * debe conocer la codificación y, a menudo, asumirá la codificación UTF-8. Generalmente, es más probable que UTF-8 se maneje correctamente. - gnasher729

@bendytree en realidad no, no lo hace, -dataUsingEncoding: devolverá una cadena no terminada en nulo que es lo que stringWithUTF8String: requiere, tiene límites para leer la memoria que no desea. Lo que lo convierte de nuevo es: -initWithData: encoding :. - Psicópata

@Albert Renshaw actualmente (no hay garantía de que las cosas sigan así) NSString utiliza UTF-16 internamente, por lo que puede haber una ligera ganancia de rendimiento porque no tiene que hacer una conversión UTF-16 <-> UTF-8. Personalmente, preferimos (como sugiere @ gnasher729) la robustez sobre el rendimiento y usamos UTF-8 en todas partes. - Algún desarrollador

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

puedes tomar referencia de esto aquí

contestado el 27 de mayo de 15 a las 11:05

Una solución de revestimiento: NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding]; - Raptor

Que Hacer:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

entonces siéntete libre de continuar NSJSONSerialization:JSONObjectWithData.


Corrección de la respuesta con respecto al terminador NULL

Siguiendo los comentarios, documentación oficial y verificaciones, esta respuesta se actualizó con respecto a la eliminación de un supuesto terminador NULL:

  1. Como documentado por dataUsingEncoding::

    Valor de retorno

    El resultado de invocar dataUsingEncoding:allowLossyConversion: con NO como segundo argumento

  2. Como documentado por getCString: maxLength: codificación: y cStringUsingEncoding::

    tenga en cuenta que los datos devueltos por dataUsingEncoding:allowLossyConversion: no es una cuerda C estricta ya que no tiene un terminador NULL

Respondido 29 Oct 18, 09:10

¡Esto está mal! Por favor, vea mi publicación aquí: stackoverflow.com/q/14087094/192819 - jpswain

Sip. dataUsingEncoding: no devuelve datos terminados en nulo. Solo UTF8String y otros métodos que devuelven una cadena C devuelven una cadena terminada en nulo. - Pedro Hosey

@PeterHosey, ¿tienes alguna fuente para eso? Me está costando encontrar eso en cualquier documento. - shortstuffsushi

Gracias @PeterHosey, los documentos que vinculó allí do declarar explícitamente la falta de terminación NULL - (note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). Debo haberme perdido esto antes. Sin embargo, me aseguraré de escribir cualquier cosa en el futuro. - shortstuffsushi

(Para cualquiera que se pregunte: la cita de shortstuffsushi está debajo cStringUsingEncoding:. Estaba mirando debajo dataUsingEncoding:.) - Pedro Hosey

En caso de que Swift Developer venga aquí,

convertir de NSString / String a NSData

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

respondido 03 mar '15, 15:03

C objetivo:

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

Swift:

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

Respondido el 08 de enero de 17 a las 04:01

Probablemente un procesador intensivo en comparación con los otros métodos, pero muy útil si está accediendo al sistema de archivos para la persistencia. Esteban J.

Primero que nada, deberías usar dataUsingEncoding: en lugar de pasar por UTF8String. Solo usas UTF8String cuando necesitas un C cadena en esa codificación.

Entonces para UTF-16, solo pasa NSUnicodeStringEncoding en lugar de NSUTF8StringEncoding en tu dataUsingEncoding: mensaje.

Respondido el 18 de enero de 13 a las 13:01

Para Swift 3, la mayoría de las veces se convertirá desde String a Data.

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

respondido 01 nov., 16:07

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

respondido 27 nov., 15:21

Esta respuesta es incorrecta cuando str contiene puntos de código mayores que 127. Esto se debe a que str.length da el número de caracteres Unicode, no el número de bytes. Por ejemplo, si str is @"にほんご", str.length da 4 mientras str.UTF8String en realidad contiene 12 bytes. Incluso si reemplaza str.length by strlen(str.UTF8String), seguirá siendo incorrecto para el caso en el que str contiene el carácter NULL, como @"にほ\0んご". - Pang

Un objeto NSData creado de esta manera arroja una excepción cuando se usa con [NSJSONSerialization JSONObjectWithData: opciones de datos: NSJSONReadingMutableLeaves error: & error]; - Blazej SLEBODA

C objetivo:

NSString a NSData:

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

NSData a NSString:

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

Swift:

Cadena a datos:

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

Datos a cadena:

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

respondido 14 mar '19, 08:03

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

Respondido 13 Abr '18, 22:04

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

Respondido 17 Abr '18, 07:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.