2012-04-02 6 views
6

Ich habe ein NSData-Objekt.Wie übergebe ich NSData als NSString und bekomme es zurück?

Ich möchte es in eine Zeichenfolge konvertieren, an eine Funktion übergeben und dann zurück in NSData-Objekt konvertieren.

Aber wie?

Ich habe diese Methode versucht, aber NSData Wert ist es anders als das Original!

hier mein Code:

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

Wie kann ich auf original NSData zurück konvertieren?

Daten und DatenNM unterscheiden sich in der Größe. Compiler zurück geben diesen Fehler:

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'

Dank.

+0

In Creating NSData Zeichenfolge Wert 'Daten' ist nicht auf etwas festgelegt, es ist nur eine leere' NSMutableData'. Wenn NSData von NSString abgerufen wird, was ist "d", ein NSString? Allgemeiner: Was versuchst du zu erreichen? – zaph

+0

'[Encoder finishEncoding]; Valorize Datenwert, der anfänglich leer ist. Ich muss eine ganze Klasse zwischen zwei Anwendungen mit 'NSKeyedArchiver' übergeben. Ja, "d" ist die zuvor erstellte Zeichenfolge. – elp

+0

Warum zu einem 'NSString' konvertieren, warum nicht einfach als' NSData' übergeben? – zaph

Antwort

5

Gelöst.

Mit dataUsingEncoding, Wert von NSData ist es anders.

Um Daten um Methoden oder Apps usw. zu übergeben, habe ich Base64-Konvertierung verwendet.

Encode

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

Decode

NSData *data = [APBase64Converter base64DataFromString:urlParams]; 

APBase64Converter Ist ein lib, die/Decoder kodieren leicht Daten und Strings. http://goo.gl/8YNjS alle

Danke:

Arbeitsbeispiel und APBase64Converter lib kann hier heruntergeladen werden.

Ich "behalte" diesen Beitrag für hilft Menschen und mir das nächste Mal!

+0

Gibt es eine Möglichkeit, dies mit von Apple bereitgestellten Funktionen anstelle einer Bibliothek eines Drittanbieters zu tun? – Orchid

+0

Ich weiß es nicht. Ich benutze meine lib in allen Projekten. :) – elp

+0

Ok, Folgefrage dann. Hat Apple eine App im App Store akzeptiert, die diese Bibliothek enthält, oder ist dies nur ein persönliches/Jailbreak-Projekt? – Orchid

0

Verwenden
NSData zu NSString:
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding
und
NSString zu NSData:
- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding

mit Codierung
NSUTF8StringEncoding
oder
NSMacOSRomanStringEncoding (WHI ch ist eine 8-Bit-Codierung).

+0

Ich brauche 'NSKeyedArchiver', um NSData zu speichern. 'dataUsingEncoding' wird bereits verwendet. Sie denken, dass 'initWithData' das Problem ist? – elp

-1

Verwenden Base64-Klasse ist es

 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]; 

     } 
in Github verfügbar

Dies ist, wie ich String in Daten umwandeln und dann Daten zu Bild.

+0

Was ist DatabaseResult? EGODatabaseRow? Base64? – elp

+0

So bekomme ich Base64 String aus der Datenbank. Über Base64 erwähne ich es bereits oben auf der Antwort. – Arun