从NSKeyedArchiver中获取NSData并转换为NSString

9
我正在尝试将NSKeyedArchiver生成的NSData转换为NSString,以便我可以传递它并最终将其转换回NSData。我必须将其作为字符串传递(我正在使用three20 URL传递)。我已经尝试了各种编码,如UTF8、ASCII等,但一切都无法正常工作。NSKeyedArchiver表示NSData格式为属性列表:NSPropertyListBinaryFormat_v1_0。
有人知道如何将此NSData转换为字符串并再次转换回来吗?字符串的大小不是问题。
谢谢
3个回答

14

你想要的是:

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]

您可以使用此处提供的NSData类别中的base64EncodedString和dataFromBase64String: NSData+Base64 ,但现在它已默认包含。


注意:现在是[data base64EncodedStringWithOptions: - Albert Renshaw

2

iOS 9.2.1,Xcode 7.2.1,启用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时,这非常有用。

希望这能帮助到某些人!干杯。


0

你所需要做的就是像这样:

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

然后提取数据:

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

不幸的是,我不确定为什么,这似乎无法工作。我的输出是一个非常短的字符串,例如 "bplist00Ô"。 - kodai
这确实很奇怪。我将测试一些替代方案,并尽快回复您,希望能提供有效的解决方案。 - justin
我发布的内容对我起了作用,但我注意到,如果您将数据从编码方法不同于解码方法的字符串解码,则会出现故障。这可以通过在编码字符串后向dataFromString实例添加retain来修复。希望这可以解决您遇到的问题。如果不行,还有其他可能需要采取的路线。 - justin

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