¿Cómo convierto un valor NSString a NSData?
Frecuentes
Visto 443,232 equipos
11 Respuestas
1427
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
Respondido 05 ago 12, 16:08
66
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
32
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:
Como documentado por dataUsingEncoding::
Valor de retorno
El resultado de invocar
dataUsingEncoding:allowLossyConversion:
con NO como segundo argumentoComo 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
20
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
18
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.
10
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
7
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
6
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
4
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
1
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
Respondido 13 Abr '18, 22:04
0
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 ios objective-c nsstring nsdata or haz tu propia pregunta.
¿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