2011-05-23 62 views
6

我想将从NSKeyedArchiver生成的NSData转换为NSString,以便我可以传递它并最终将其转换回NSData。我必须将其作为字符串传递(我使用three20 URL传递)。我已经通过各种编码,UTF8,ASCII等,并且无法获得任何工作。 NSKeyedArchiver表示NSData被格式化为属性列表:NSPropertyListBinaryFormat_v1_0。从NSKeyedArchiver到NSString的NSData

有没有人有任何想法如何我可以将此NSData转换为字符串,然后再回来?字符串的大小不是问题。

感谢

回答

11

你想要的是:

id<nscoding> obj; 

NSData * data  = [NSKeyedArchiver archivedDataWithRootObject:obj]; 
NSString * string = [data base64EncodedString]; 

然后其他呃办法解决

NSString * string; 

NSData * data = [NSData dataFromBase64String:string]; 
id<nscoding> obj = [NSKeyedUnarchiver unarchiveObjectWithData:data] 

您可以添加base64EncodedString和dataFromBase64String:使用可这里NSData+Base64 NSData的类别,但它现在是默认

1

所有你应该做的是这样的:

NSData *dataFromString = [[NSString stringWithFormat:@"%@", yourString] dataUsingEncoding:NSASCIIStringEncoding]; 

然后提取数据:

NSString *stringFromData = [[NSString alloc] initWithData:dataFromString encoding:NSASCIIStringEncoding]; 
+0

不幸的是,我不知道为什么,这似乎并不奏效。我得到一个非常短的字符串,例如“bplist00Ô”作为我的输出。 – kodai 2011-05-23 22:28:51

+0

这绝对是奇怪的。我会测试一些东西作为替代品,并回复给你(希望)可以工作的东西 – justin 2011-05-23 22:30:46

+0

我发布的内容对我来说是个窍门,但我注意到如果你用不同的方法将数据解码为字符串当你编码它时,你会得到错误。在对字符串进行编码之后,可以通过将'retain'添加到'dataFromString'实例来解决这个问题。希望这能解决你遇到的问题。如果不是,如有必要还有另一种可能的途径 – justin 2011-05-23 22:44:38

2

的iOS 9.2.1,7.2.1的Xcode包括,ARC启用

base64EncodedString,dataFromBase64String:贬值的iOS 7.0后

更新的解决方案:

编码为字符串:

id<nscoding> obj; 

NSData *data  = [NSKeyedArchiver archivedDataWithRootObject:obj]; 
NSString *string = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; 

解码数据:

NSString *string; 

NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:(NSDataBase64DecodingIgnoreUnknownCharacters)]; 
id<nscoding> obj = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

注:与钥匙串来存储工作时,这是非常有用的将密钥/值对的字典转换为kSecValueData。

希望这可以帮助别人!干杯。