【问题标题】:Casting NSString to NSData将 NSString 转换为 NSData
【发布时间】:2012-10-05 13:25:56
【问题描述】:

有没有办法将 NSString 存储在 NSData 中以维护 SAME 数据?

示例(这很好,但这不是我需要的):

NSString *tmpString = @"Hello World!";
NSData *nsdataString = [tmpString dataUsingEncoding:NSUTF8StringEncoding];


我需要这样的东西(显然失败了):

NSData nsdataString = @"Hello World!";


简而言之:我需要像使用 NSData 一样使用 NSData (比如使用强制转换运算符)。这种方法对于预加载加密的核心数据 sqlite 数据库(在 NSString 中)非常有用,并且仅当用户访问持久存储的字段时才解密。 要解密我使用:

NSData *decryptedData = [encryptedData AES256DecryptWithKey:keyString];

其中 encryptedData 是 NSData,keyString 是 NSString。

非常感谢大家!

【问题讨论】:

    标签: encryption casting nsstring nsdata nsstringencoding


    【解决方案1】:

    简短回答:不。

    NSData 对象是原始 1 和 0 序列的包装器。 NSString 对象是未公开编码中 Unicode 字符数组的包装器。

    根据用于编写 NSData 的字符串编码,它可以表示许多不同的字符串。例如:代表相同字符的 little-endian UTF16 和 big-endian UTF16 字符串看起来会有所不同,并且尝试将 UTF-8 字符串解析为 UTF-16 会产生乱码。

    这就是为什么在将 NSData 视为字符串之前必须将其转换为 NSString 的原因:因为在指定编码之前,它不是字符串;它只是原始的 1 和 0。

    从您的问题中我不确定您为什么要这样做,但是您可以使用 C 字符串(而不是 NSString)来完成您需要的操作,您可以使用 NSData 的 -bytes 方法获得它。但是,如果你想在任何时候得到一个有用的字符串,你仍然需要记住编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 2012-11-09
      • 2011-11-11
      相关资源
      最近更新 更多