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 的状态
将 NSDictionary 对象转换为 NSData 对象,反之亦然