2011-05-23 15 views
6

Estoy tratando de convertir NSData generado desde NSKeyedArchiver a NSString para poder pasarlo y eventualmente convertirlo a NSData. Tengo que pasar esto como una cadena (estoy usando tres20 URL pasando). He revisado varias codificaciones, UTF8, ASCII, etc. y no puedo hacer que nada funcione. NSKeyedArchiver dice que NSData está formateado como una lista de propiedades: NSPropertyListBinaryFormat_v1_0.NSData de NSKeyedArchiver a NSString

¿Alguien tiene alguna idea de cómo puedo convertir este NSData en una cadena y viceversa? El tamaño de la cuerda no es un problema.

Gracias

Respuesta

11

Lo que queremos es:

id<nscoding> obj; 

NSData * data  = [NSKeyedArchiver archivedDataWithRootObject:obj]; 
NSString * string = [data base64EncodedString]; 

Y luego la oth er revés

NSString * string; 

NSData * data = [NSData dataFromBase64String:string]; 
id<nscoding> obj = [NSKeyedUnarchiver unarchiveObjectWithData:data] 

Puede añadir base64EncodedString y dataFromBase64String: con la categoría NSData disponible aquí NSData+Base64 pero ahora está incluido por defecto

1

todo lo que tiene que hacer es algo como esto:

NSData *dataFromString = [[NSString stringWithFormat:@"%@", yourString] dataUsingEncoding:NSASCIIStringEncoding]; 

a continuación para extraer los datos:

NSString *stringFromData = [[NSString alloc] initWithData:dataFromString encoding:NSASCIIStringEncoding]; 
+0

Lamentablemente, y no estoy seguro de por qué, esto no parece funcionar. Obtengo una secuencia muy corta, por ejemplo "bplist00Ô" como mi salida. – kodai

+0

Eso es definitivamente extraño. Voy a probar un par de cosas como alternativas y me pondré en contacto contigo (con suerte) algo que sí funciona – justin

+0

Lo que publiqué me gustó, aunque noté que si decodificabas los datos en una cadena desde un método diferente que cuando lo codificas, obtienes fallas. Esto puede solucionarse agregando 'retener' a la instancia' dataFromString' después de codificar la cadena. Espero que esto solucione el problema que estabas teniendo. Si no, hay otra ruta posible para tomar si es necesario – justin

2

iOS 9.2.1, Xcode 7.2.1, ARC habilitado

base64EncodedString, dataFromBase64String: depreciado después de iOS 7,0

solución Actualizado:

Codificar a cadena:

id<nscoding> obj; 

NSData *data  = [NSKeyedArchiver archivedDataWithRootObject:obj]; 
NSString *string = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; 

decodificación de los datos:

NSString *string; 

NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:(NSDataBase64DecodingIgnoreUnknownCharacters)]; 
id<nscoding> obj = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

Nota: Esto es muy útil cuando se trabaja con llavero para almacenar un diccionario de pares clave/valor en kSecValueData.

Espero que esto ayude a alguien! Aclamaciones.