2012-04-02 2 views
6

Ho un oggetto NSData.Come passare NSData come NSString e recuperarlo?

Voglio convertirlo in una stringa, passare a una funzione e quindi riconvertire l'oggetto NSData.

Ma come?

Ho provato questo metodo, ma il valore NSData è diverso dall'originale!

qui il mio codice:

// 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); 

Come posso convertire Torna all'originale NSData?

dati e datiNM sono di dimensioni diverse. Compiler restituire questo errore:

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'

grazie.

+0

Nella creazione del valore di stringa NSData, 'data' non è impostato su nulla, è solo un' NSMutableData' vuoto. In Getting NSData from NSString cosa è 'd', una NSString? Più in generale, cosa stai cercando di realizzare? – zaph

+0

'[encoder finishEncoding];' valorizza il valore dei dati che è inizialmente vuoto. Devo passare un'intera classe tra due applicazioni usando 'NSKeyedArchiver'. Sì, 'd' è la stringa creata prima. – elp

+0

Perché convertire in un 'NSString', perché non passare semplicemente come' NSData'? – zaph

risposta

5

Risolto.

Utilizzando dataUsingEncoding, il valore di NSData è diverso.

Per passare i dati intorno a metodi o app, ho utilizzato la conversione base64.

Encode

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

Decode

NSData *data = [APBase64Converter base64DataFromString:urlParams]; 

APBase64Converter È un lib che codifica/decodifica facilmente i dati e stringhe.

esempio di lavoro e APBase64Converter lib può essere scaricato da qui: http://goo.gl/8YNjS

Grazie a tutti.

I "conserva" questo post per aiutare la gente e me la prossima volta!

+0

C'è un modo per farlo usando le funzioni fornite da Apple invece di una libreria di terze parti? – Orchid

+0

non lo so. Uso la mia lib in tutti i progetti. :) – elp

+0

Ok, domanda successiva. Apple ha accettato un'app nell'App Store contenente questa libreria o è solo un progetto personale/di jailbreak? – Orchid

0

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

con codifica
NSUTF8StringEncoding
o
NSMacOSRomanStringEncoding (WHI ch è una codifica a 8 bit).

+0

Ho bisogno di usare 'NSKeyedArchiver' per memorizzare NSData. 'dataUsingEncoding'è già utilizzato. Pensi che sia 'initWithData' il problema? – elp

-1

Usa Base64 classe è disponibile in 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]; 

     } 

questo è come mi convertire la stringa di dati e quindi i dati di immagine.

+0

Che cos'è DatabaseResult? EGODatabaseRow? Base64? – elp

+0

questo è il modo in cui ottengo la stringa base64 dal database. Su Base64 lo menziono già all'inizio della risposta. – Arun