如何将NSData作为NSString传递并将其取回?

时间:2012-04-02 13:20:29

标签: iphone objective-c ipad nsstring nsdata

我有一个NSData对象。

我想将其转换为字符串,传递给函数,然后重新转换回NSData对象。

但是怎么样?

我试过这个方法,但是NSData的价值与原来不同!

这里是我的代码:

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

如何转换回原始NSData?

数据和dataNM的大小不同。 编译器给出了这个错误:

  

2012-04-02 16:33:28.269 DataTest [18008:f803] - [__ NSCFData   objectForKey:]:无法识别的选择器发送到实例0x6b46c80

     

2012-04-02 16:33:28.270 DataTest [18008:f803] * 终止app到期   未捕获的异常'NSInvalidArgumentException',原因:   ' - [__ NSCFData objectForKey:]:发送到实例的无法识别的选择器   0x6b46c80'

感谢。

3 个答案:

答案 0 :(得分:5)

解决。

使用dataUsingEncoding,NSData的值不同。

要传递方法或应用程序等数据,我使用了base64转换。

编码

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

解码

NSData *data = [APBase64Converter base64DataFromString:urlParams];

APBase64Converter 是一个可以轻松编码/解码数据和字符串的库。

可以从此处下载工作示例和 APBase64Converter lib:http://goo.gl/8YNjS

谢谢大家。

我“保留”此帖可以帮助我和下次的人!

答案 1 :(得分:0)

使用
NSDataNSString
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding

NSStringNSData
- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding

带编码
NSUTF8StringEncoding

NSMacOSRomanStringEncoding(这是一种8位编码)。

答案 2 :(得分:-1)

使用github中提供的Base64类

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

        }

这就是我将String转换为数据然后将数据转换为图像的方式。