2012-04-02 11 views
6

Bir NSData nesnesine sahibim.NSData NSString olarak nasıl geçilir ve geri alınır?

Onu bir dizeye dönüştürmek, bir işleve geçmek ve sonra da NSData nesnesine yeniden dönüştürmek istiyorum.

Ama Nasıl?

Bu yöntemi denedim, ancak NSData değeri, orijinalinden farklı! Burada

kodum:

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

Nasıl geri orijinal NSData dönüştürebilirsiniz?

veri ve dataNM boyutları farklı.

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'

sayesinde: Derleyici bu hatayı geri ver.

+0

NSData oluşturma dizesi dize değeri "data" hiçbir şey için ayarlanmamış, sadece bir boş 'NSMutableData'. NSString'den NSData'nın alınmasında n, nSString nedir? Daha genel olarak ne elde etmeye çalışıyorsunuz? – zaph

+0

'[encoder finishEncoding];' başlangıçta boş olan veri değerini değerlendirir. NSKeyedArchiver' kullanarak iki uygulama arasında bütün bir sınıfı geçmem gerekiyor. Evet, daha önce yaratılan dizedir. – elp

+0

Niçin 'NSString''e dönüşüyor, neden sadece 'NSData' olarak geçmiyorsunuz? – zaph

cevap

5

Çözüldü.

dataUsingEncoding'u kullanarak, NSData'nın değeri farklıdır.

Verileri veya uygulamaları, vb. Etrafındaki verileri iletmek için base64 dönüştürmeyi kullandım.

kodlama

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

kod çözme

NSData *data = [APBase64Converter base64DataFromString:urlParams]; 

APBase64Converter kolay veri ve dizeleri/kod çözme kodlayan lib mi.

Çalışma örneği ve APBase64Converter lib buradan indirilebilir: http://goo.gl/8YNjS

teşekkürler hepsi.

Bir dahaki sefere insanlara yardım etmek için bu yazıyı "saklıyorum"!

+0

Üçüncü taraf kitaplığı yerine Apple tarafından sağlanan işlevleri kullanarak bunu yapmanın bir yolu var mı? – Orchid

+0

bilmiyorum. Lib'imi tüm projelerde kullanıyorum. :) – elp

+0

Tamam, takip eden soru o zaman. Apple, bu kütüphaneyi içeren App Store'a bir uygulamayı kabul etti mi, yoksa bu sadece bir kişisel/jailbreak projesi mi? – Orchid

0

kullanımlar
NSDataNSString için:
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding
ve
NSStringNSData için:
- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding


NSUTF8StringEncoding
veya
NSMacOSRomanStringEncoding (WHI kodlama ile ch, 8 bitlik bir kodlamadır).

+0

NSData'yı depolamak için 'NSKeyedArchiver' kullanmam gerekiyor. 'dataUsingEncoding' zaten kullanılmış. Sizce initWithData' sorun mu? – elp

-1

Kullanım Base64 sınıf i görüntüye sonra verileri verilere Dize dönüştürmek ve nasıl budur 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]; 

     } 

mevcuttur.

+0

DatabaseResult nedir? EGODatabaseRow? Base64? – elp

+0

Bu, base64 dizesini veritabanından nasıl alırım. Base64 hakkında ben zaten cevabın başında bahsetmiştim. – Arun