【问题标题】:Cannot convert NSData to NSString无法将 NSData 转换为 NSString
【发布时间】:2014-05-08 23:50:13
【问题描述】:

我有如下加密的文本:

NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
NSData *encryptedData = [RNEncryptor encryptData:data withSettings:kRNCryptorAES256Settings password:[loggedUser getKey]error:&error];

然后,我试图将字符串转换并存储在某个地方。这就是我正在尝试的:

NSString *convertedString = [[NSString alloc] initWithData:encryptedData encoding:NSUTF8StringEncoding];

然而,字符串 convertedString 始终为 null/nil,即使调试器向我显示 encryptedData 中始终包含数据。如何将其转换为字符串?另外,按照同样的思路,如何将其转换回NSData 以便稍后解密?

这是我正在尝试转换的NSData 的示例输出:

encryptedData的打印说明:

【问题讨论】:

  • 您必须从解密数据而不是加密数据创建字符串。您必须完全反转用于加密字符串的代码。
  • 我的目标是创建 NSData 的字符串形式,以便我可以通过网络发送它。我完全理解它在这种状态下是不可读的。我的网络服务(解析)不会直接接受 NSData。
  • 您应该直接发送NSData。或base64编码
  • @johnhannigan Bryan 是正确的,您需要对加密数据使用 base64 编码。这将为您提供一个可以发送到服务器的字符串。当然,这假设服务器需要加密数据的 base64 字符串表示。
  • 谢谢@BryanChen,成功了。如果你或 rmaddy 做出回答,我会接受。

标签: ios objective-c nsstring nsdata


【解决方案1】:

您应该直接发送NSData。或 base64 使用base64EncodedStringWithOptions: 对其进行编码

【讨论】:

  • 要明确这里的问题:任意字节包(NSData)可能会也可能不会碰巧代表合法的 UTF-8 字符串。并非每个位序列在 UTF-8 中都是合法的。因此,不仅您可能会编码为乱码(就像大多数人期望的那样),而且您根本不会编码。正如 Bryan 所说,如果必须转换为字符串,Base-64 是一种非常常用的工具;但如果可能,请使用 NSData 本身。
【解决方案2】:

试试这个:

NSString *a = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSASCIIStringEncoding];

除了 UTF-8 编码之外最常见的是:

  • NSASCIIStringEncoding
  • NSUnicodeStringEncoding
  • NSISOLatin1StringEncoding
  • NSISOLatin2StringEncoding
  • NSSymbolStringEncoding

【讨论】:

    猜你喜欢
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2010-12-21
    • 2012-11-09
    相关资源
    最近更新 更多