如何将NSData转换为NSString并获取回来?

6

我有一个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?

data和dataNM的大小不同。 编译器会返回以下错误:

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'

谢谢。


在创建NSData字符串值时,data并没有被设置成任何值,它只是一个空的NSMutableData。在从NSString获取NSData时,变量d是一个NSString吗?更一般地说,您想要实现什么目标? - zaph
[encoder finishEncoding]; 这行代码将编码器的编码过程完成。数据值最初为空,需要对其进行赋值。我需要使用 NSKeyedArchiver 在两个应用程序之间传递整个类。是的,d 是之前创建的字符串。 - elp
为什么要转换为 NSString,而不是直接传递为 NSData - zaph
3个回答

5

已解决。

使用dataUsingEncoding方法,NSData的值会发生变化。

为了在方法或应用程序之间传递数据,我使用了base64转换。

编码

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

解码

NSData *data = [APBase64Converter base64DataFromString:urlParams];

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

可以从这里下载使用示例和APBase64Converter库:http://goo.gl/8YNjS

感谢大家。

我会保存这篇文章,以便下次帮助自己或他人!


有没有使用苹果官方的函数来完成这个而不是用第三方库的方法? - Orchid
我不知道。我在所有项目中使用我的库。 :) - elp
好的,那么接下来的问题是,苹果是否已经接受了一个包含这个库的应用程序进入App Store,还是这只是一个个人/越狱项目? - Orchid
是的,它使用像这个http://cocoadev.com/wiki/BaseSixtyFour这样的简单函数。代码中没有奇怪的东西。 - elp

0
使用以下方法将 NSData 转换为 NSString
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding
使用以下方法将 NSString 转换为 NSData
- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding
编码方式可以选择:
NSUTF8StringEncoding
或者
NSMacOSRomanStringEncoding(这是一种 8 位编码)。

我需要使用NSKeyedArchiver来存储NSData。已经使用了dataUsingEncoding。你认为问题出在initWithData上吗? - elp

-1

使用Base64类,它可以在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];

        }

这是我如何将字符串转换为数据,然后将数据转换为图像。


什么是DatabaseResult?EGODatabaseRow?Base64? - elp
这是我从数据库获取Base64字符串的方法。关于Base64,我已经在答案顶部提到过了。 - Arun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接