解码混淆值-无法将数据转换为字符串

时间:2018-11-08 16:46:32

标签: ios swift utf-8

我正在从旧版C ++代码库中导入文件。从技术上讲,该文件本身是JSON,但是在我收到该文件之前,值之一已在C ++代码库中用XOR函数进行了模糊处理。

{"version": 15, "data": "C\u0016Q45\u0010 46QY\\\u0011\n\u0019a\u0003\u0019}\u001apg"}

技术上,“数据”的值是UTF8字符串。

我知道用于将数据解码为可用JSON字符串的算法。但是,显然由于格式问题,我无法迅速将其解析为[String:String]。

Error Domain=NSCocoaErrorDomain Code=3840 "Unable to convert data to string around character 31."

到目前为止,我已经设法通过隔离子数据来获取有问题的特定数据

 let encryptedData = data.subdata(in: dataPrefixLength ..< dataLength - 2)

即使如此,当我尝试使用UTF8编码将其解析为String时,我似乎仍然无法迅速将其解析为String。

String(data: encryptedData, encoding: .utf8)

还值得注意的是,在检查数据本身时,调试器中的String描述似乎还不错。

我真的很感谢任何建议。 谢谢!

1 个答案:

答案 0 :(得分:2)

从您的示例中可以看出,混淆会生成二进制数据,并将二进制数据放入字符串中。 JSON不允许这样做。因此,它是无效的JSON,任何具有合理验证量的解析器都将拒绝它。

例如,以字符串开头:

"C\u0016

以字符“ C”开头。是有效的。

然后是一个十六进制值的转义字符:0016。但是,U + 0016不是有效的Unicode代码点。因此,它被拒绝了。可能应该是二进制字节0x16。但是您不能将其放入JSON字符串中。

您有两个选择:

  1. 修复数据源,例如通过在将二进制数据放入JSON之前使用Base64编码。

  2. 编写您自己的JSON解析器以处理无效的JSON。