NSData 从 NSKeyedArchiver 到 NSString

Posted

技术标签:

【中文标题】NSData 从 NSKeyedArchiver 到 NSString【英文标题】:NSData from NSKeyedArchiver to NSString 【发布时间】:2011-08-31 12:11:01 【问题描述】:

我正在尝试将从 NSKeyedArchiver 生成的 NSData 转换为 NSString,以便我可以将其传递并最终将其转换回 NSData。我必须将其作为字符串传递(我正在使用 three20 URL 传递)。我经历了各种编码、UTF8、ASCII 等,但无法正常工作。 NSKeyedArchiver 表示 NSData 被格式化为属性列表:NSPropertyListBinaryFormat_v1_0。

有谁知道如何将这个 NSData 转换为字符串并再次返回?字符串的大小不是问题。

谢谢

【问题讨论】:

【参考方案1】:

你想要的是:

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 类别在这里可用NSData+Base64 但现在默认包含它

【讨论】:

注:现在是[data base64EncodedStringWithOptions:【参考方案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 时非常有用。

希望这对某人有所帮助!干杯。

【讨论】:

【参考方案3】:

你应该做的就是这样:

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

然后提取数据:

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

【讨论】:

不幸的是,我不知道为什么,这似乎不起作用。我得到一个非常短的字符串,例如“bplist00Ô”作为我的输出。 这绝对是奇怪的。我将测试几样东西作为替代品,然后(希望)用一些可行的方法回复你 我发布的内容对我有用,但我注意到,如果您使用与编码不同的方法将数据解码为字符串,则会出现错误。这可以通过在对字符串进行编码后将retain 添加到dataFromString 实例来解决。希望这可以解决您遇到的问题。如果没有,如有必要,还有其他可能的路线

以上是关于NSData 从 NSKeyedArchiver 到 NSString的主要内容,如果未能解决你的问题,请参考以下文章

从 NSKeyedArchiver 加载 Singleton 的状态

NSKeyedArchiver

将 NSDictionary 对象转换为 NSData 对象,反之亦然

NSKeyedArchiver archivedDataWithRootObject:

iOS NSKeyedArchiver(轻量级缓存)

iOS 字典和NSData之间转换