2012-04-02 14 views
6

Mam obiekt NSData.Jak przekazać NSData jako NSString i odzyskać?

Chcę przekonwertować go na ciąg, przekazać do funkcji, a następnie wrócić do obiektu NSData.

Ale jak?

Próbowałem tej metody, ale wartość NSData różni się od oryginału!

tutaj mój kod:

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

Jak mogę przekonwertować z powrotem do pierwotnego NSData?

Dane i daneNM mają różny rozmiar. Compiler oddać ten błąd:

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'

dzięki.

+0

Podczas tworzenia NSData wartość ciągu 'data' nie jest ustawiona na nic, jest to po prostu pusta' NSMutableData'. W Pobieranie NSData z NSString, co to jest "d", NSString? Bardziej ogólnie, co próbujesz osiągnąć? – zaph

+0

'[enkoder finishEncoding];' waloryzuje wartość danych, która jest początkowo pusta. Muszę przekazać całą klasę między dwiema aplikacjami za pomocą 'NSKeyedArchiver'. Tak, 'd' jest ciągiem utworzonym wcześniej. – elp

+0

Dlaczego warto przekonwertować na 'NSString', dlaczego po prostu nie przekazać jako' NSData'? – zaph

Odpowiedz

5

Rozwiązany.

Przy użyciu wartości, wartość NSData jest różna.

Aby przekazywać dane dotyczące metod lub aplikacji itp., Użyłem konwersji base64.

Koduje

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

Decode

NSData *data = [APBase64Converter base64DataFromString:urlParams]; 

APBase64Converter Czy lib że kodowanie/dekodowanie danych łatwo i sznurki.

przykład Praca i APBase64Converter lib można pobrać stąd: http://goo.gl/8YNjS

Dzięki wszystkim.

"Zatrzymam" ten post, aby pomóc następnym razem!

+0

Czy można to zrobić za pomocą funkcji dostarczonych przez Apple zamiast biblioteki innej firmy? – Orchid

+0

Nie wiem. Używam mojej biblioteki we wszystkich projektach. :) – elp

+0

OK, to pytanie uzupełniające. Czy Apple przyjął aplikację do App Store, która zawiera tę bibliotekę, czy jest to tylko projekt osobisty/jailbreak? – Orchid

0

Zastosowanie
NSData do NSString:
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding
i
NSString do NSData:
- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding

kodującym
NSUTF8StringEncoding
lub
NSMacOSRomanStringEncoding (WHI ch to 8-bitowe kodowanie).

+0

Potrzebuję użyć 'NSKeyedArchiver' do przechowywania NSData. 'dataUsingEncoding'jest już używany. Myślisz, że to "initWithData" to problem? – elp

-1

klasa Użyj Base64 jest dostępny w 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]; 

     } 

ten sposób przekonwertować ciąg danych, a następnie dane obrazu.

+0

Co to jest DatabaseResult? EGODatabaseRow? Base64? – elp

+0

tak otrzymuję ciąg base64 z bazy danych. O Base64 już wspominam o tym na samym początku. – Arun