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

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

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

谢谢

【问题讨论】:

    标签: objective-c cocoa nsstring nsdata nskeyedarchiver


    【解决方案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 实例来解决。希望这可以解决您遇到的问题。如果没有,如有必要,还有其他可能的路线
      猜你喜欢
      • 2011-03-02
      • 2018-01-04
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      相关资源
      最近更新 更多