2012-04-02 10 views
6

tengo un objeto NSData.¿Cómo pasar NSData como NSString y recuperarlo?

Quiero convertirlo en una cadena, pasar a una función y luego volver a reconvertirlo al objeto NSData.

Pero ¿cómo?

Intenté este método, pero el valor de NSData es diferente al original.

aquí mi código:

// a generic class 
    APClass *c = [[APClass alloc] init]; 
    c.aNumber = 123; 
    c.aString = @"my string"; 

    // my data obj 
    NSMutableData *data = [NSMutableData data]; 

    // archiver to store class in nsdata 
    NSKeyedArchiver *encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
    [encoder encodeObject:[NSNumber numberWithInt:c.aNumber] forKey:@"aNum"]; 
    [encoder encodeObject:c.aString forKey:@"aStr"]; 
    [encoder finishEncoding]; 
    [encoder release]; 

    [c release]; 

    NSLog(@"%@", data); 
    NSString *d = [NSString stringWithFormat:@"%@", data]; 

    // --- 

    NSString *strFromData = [NSString stringWithFormat:@"%@", d]; 

    NSData *dataNM = [strFromData dataUsingEncoding:NSUTF8StringEncoding]; 

    // decoder to retrieve class from nsdata  
    NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:dataNM]; 
    int number  = [[decoder decodeObjectForKey:@"aNum"] intValue]; 
    NSString *string = [decoder decodeObjectForKey:@"aStr"]; 
    [decoder finishDecoding]; 
    [decoder release]; 

    NSLog(@"[Number: %d] -- [String: %@]", number, string); 

¿Cómo puedo convertir de nuevo a NSData original?

datos y dataNM son de un tamaño diferente. Compilador devolver este error:

2012-04-02 16:33:28.269 DataTest[18008:f803] -[__NSCFData objectForKey:]: unrecognized selector sent to instance 0x6b46c80

2012-04-02 16:33:28.270 DataTest[18008:f803] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFData objectForKey:]: unrecognized selector sent to instance 0x6b46c80'

gracias.

+0

Al crear el valor de cadena de NSData 'data' no está configurado a nada, es solo un' NSMutableData' vacío. En Getting NSData from NSString, ¿qué es 'd', un NSString? En general, ¿qué estás tratando de lograr? – zaph

+0

'[encoder finishEncoding];' valor valor de datos que está inicialmente vacío. Necesito pasar una clase completa entre dos aplicaciones usando 'NSKeyedArchiver'. Sí, 'd' es la cadena creada antes. – elp

+0

¿Por qué convertir a 'NSString', por qué no simplemente pasar como' NSData'? – zaph

Respuesta

5

Resuelto.

Usando dataUsingEncoding, el valor de NSData es diferente.

Para pasar datos sobre métodos o aplicaciones, etc., he utilizado la conversión de base64.

Codificar

NSString *d = 
    [NSString stringWithFormat:@"appdue://obj=%@", 
    [APBase64Converter base64forData:data]]; 

Decode

NSData *data = [APBase64Converter base64DataFromString:urlParams]; 

APBase64Converter Es una librería que codificar/decodificar fácilmente los datos y cadenas.

Ejemplo de trabajo y APBase64Converter lib se pueden descargar desde aquí: http://goo.gl/8YNjS

Gracias a todos.

¡"Retiro" esta publicación para ayudar a las personas y a mí la próxima vez!

+0

¿Hay alguna forma de hacerlo utilizando las funciones proporcionadas por Apple en lugar de una biblioteca de terceros? – Orchid

+0

no lo sé. Uso mi lib en todos los proyectos. :) – elp

+0

Bien, pregunta de continuación, entonces. ¿Ha aceptado Apple una aplicación en la App Store que contiene esta biblioteca, o es solo un proyecto personal/jailbreak? – Orchid

0

Uso
NSData-NSString:
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding
y
NSString-NSData:
- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding

con codificación
NSUTF8StringEncoding
o
NSMacOSRomanStringEncoding (WHI ch es una codificación de 8 bits).

+0

Necesito usar 'NSKeyedArchiver' para almacenar NSData. 'dataUsingEncoding' ya está usado. ¿Crees que es 'initWithData' el problema? – elp

-1

clase Uso base 64 que está disponible en GitHub

 DatabaseResult* result = [self.database executeQuery:@"SELECT * FROM `images`  WHERE image_id = ? AND imagetype = ?", self.routeId,self.imagetype]; 

     for(EGODatabaseRow* row in result) { 

     NSString *strImage=[row stringForColumn:@"image_photo"]; 

     [Base64 initialize]; 

     NSData *data = [Base64 decode:strImage]; 

     UIImage *image=[UIImage imageWithData:data]; 

     } 

Éste es cómo convertir una cadena de datos y luego los datos de imagen.

+0

¿Qué es DatabaseResult? EGODatabaseRow? Base64? – elp

+0

así es como obtengo la cadena base64 de la base de datos. Acerca de Base64 ya lo mencioné en la parte superior de la respuesta. – Arun