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

elp*_*elp 6 iphone objective-c nsstring nsdata ipad

我有一个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);
Run Code Online (Sandbox Code Playgroud)

我怎样才能转换回原始的NSData?

data和dataNM的大小不同.编译器给出了这个错误:

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

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

谢谢.

elp*_*elp 5

解决了.

使用dataUsingEncoding,NSData的价值不同.

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

编码

NSString *d = 
  [NSString stringWithFormat:@"appdue://obj=%@", 
     [APBase64Converter base64forData:data]];
Run Code Online (Sandbox Code Playgroud)

解码

NSData *data = [APBase64Converter base64DataFromString:urlParams];
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢大家.

我"保留"这篇文章,以帮助人们和我下次!