¿Cómo convierto un valor NSString a NSData?

Respuestas:

1419
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
Flitzwald
fuente
¿Cuáles son los pros y los contras de usar UTF-8 en lugar de algo más alto como UTF-16 o UTF-32?
Albert Renshaw
44
Al NSData no le importa mucho si es UTF-8 o UTF-16 o UTF-32. Hay dos problemas: uno, UTF-16 y UTF-32 deben tener el orden de bytes correcto. Dos, quien lo vuelva a convertir en un NSString * debe conocer la codificación, y a menudo asumirá la codificación UTF-8. En general, es más probable que UTF-8 se maneje correctamente.
gnasher729
1
@bendytree en realidad no, no lo hace, -dataUsingEncoding: devolverá una cadena sin terminación nula, que es lo que stringWithUTF8String: requiere, tiene límites para leer la memoria que no desea. Lo que lo convierte de nuevo es: -initWithData: codificación :.
Psico
1
@Albert Renshaw actualmente (sin garantía de que las cosas se mantengan de esta manera) NSStringusa 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) robustez sobre el rendimiento y usamos UTF-8 en todas partes.
Algunos desarrolladores
66
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

puedes tomar referencia desde este enlace

ALOK KUMAR
fuente
3
Una solución de línea:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
Raptor
32

Hacer:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

entonces siéntase libre de proceder NSJSONSerialization:JSONObjectWithData.


Corrección a la respuesta con respecto al terminador NULL

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

  1. Según lo documentado por dataUsingEncoding ::

    Valor de retorno

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

  2. Según lo documentado por getCString: maxLength: encoding: y cStringUsingEncoding ::

    tenga en cuenta que los datos devueltos por dataUsingEncoding:allowLossyConversion:no son una cadena C estricta ya que no tienen un terminador NULL

Andrew Kolesnikov
fuente
14
¡Esto está mal! Vea mi publicación aquí: stackoverflow.com/q/14087094/192819
jpswain
44
Sip. dataUsingEncoding:no devuelve datos terminados en nulo. Solo UTF8Stringy otros métodos que devuelven una cadena C devuelven una cadena terminada en nulo.
Peter Hosey
@ PeterHosey, ¿tienes alguna fuente para eso? Me está costando encontrar eso en cualquier documento.
shortstuffsushi
1
Gracias @PeterHosey, los documentos vinculados que hay qué dice 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
1
(Para cualquiera que se pregunte: la cita de shortstuffsushi está debajo cStringUsingEncoding:. Estaba mirando debajo dataUsingEncoding:.)
Peter Hosey
20

En caso de que Swift Developer venga aquí,

para convertir de NSString / String a NSData

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
Sruit A.Suk
fuente
18

C objetivo:

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
Shamsiddin
fuente
Probablemente intensivo en procesador en comparación con los otros métodos, pero muy útil si está accediendo al sistema de archivos por persistencia
Stephen J
10

En primer lugar, debe usar en dataUsingEncoding:lugar de pasar UTF8String. Solo se usa UTF8Stringcuando necesita una Ccadena en esa codificación.

Luego, para UTF-16, simplemente pasa en NSUnicodeStringEncodinglugar de NSUTF8StringEncodingen tu dataUsingEncoding:mensaje.

Jerry Thomsan
fuente
7

Para Swift 3, en su mayoría se convertirá de Stringa Data.

let myString = "test"
let myData = myString.data(using: .utf8)
print(myData) // Optional(Data)
jacks205
fuente
6
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
Nex Mishra
fuente
55
Esta respuesta es incorrecta cuando strcontiene puntos de código mayores que 127. Esto se debe a que str.lengthproporciona la cantidad de caracteres Unicode, no la cantidad de bytes. Por ejemplo, si stres así @"にほんご", str.lengthda 4 mientras que en str.UTF8Stringrealidad contiene 12 bytes. Incluso si reemplaza str.lengthpor strlen(str.UTF8String), seguirá siendo incorrecto para el caso donde strcontiene 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];
Adobels
2

C objetivo:

NSString a NSData:

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

NSData a NSString:

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

Rápido:

Cadena de datos:

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

Datos a la cadena:

var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!
Mella
fuente
1
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
Kamani Jasmin
fuente
0

C objetivo

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)
Rohit Makwana
fuente