UInt8 XOR'd array result to NSString conversion returns nil every time

UInt8 XOR'd array result to NSString conversion returns nil every time

我在使用 iOS Swift 2.0 对 [UInt8] 执行 XOR 并将 XORd 结果转换为字符串时遇到问题。我不得不与一个原始服务器接口,该服务器想要使用预定义的 UInt8 值数组和 return 进行简单的 XOR 加密,结果为字符串。

使用iOS Swift 2.0 Playground,创建以下数组:

let xorResult : [UInt8] = [24, 48, 160, 212]   // XORd result
let result = NSString(bytes: xorResult, length: xorResult.count, encoding: NSUTF8StringEncoding)

结果始终为零。如果从数组中删除 160 和 212 值,NSString 就不是 nil。如果我切换到 NSUTF16StringEncoding 那么我不会收到 nil,但是,服务器不支持 UTF16。我已经尝试将值转换为十六进制字符串,然后将十六进制字符串转换为 NSData,然后尝试将其转换为 NSUTF8StringEncoding 但在我删除 160 和 212 之前仍然为零。我知道此算法适用于 Java,但是在 Java 中,我们结合使用了 char 和 StringBuilder,一切都很顺利。在 iOS Swift 中有解决这个问题的方法吗?

要将任意二进制数据块存储为字符串,您需要 一个字符串编码,它将每个字节 (0 ... 255) 映射到一些 特点。 UTF-8 没有这个 属性,例如 160 是多字节 UTF-8 序列的开始,它本身无效。

使用此 属性 的最简单编码是 ISO Latin 1 aka ISO 8859-1, 这是 ISO/IEC 8859-1 辅以 C0 和 C1 控制代码时的编码。 它映射 Unicode 代码点 U+0000 .. U+00FF 到字节 0x00 .. 0xFF(比较 8859-1.TXT)。

此编码适用于 (NS)String 作为 NSISOLatin1StringEncoding.

请注意:将任意二进制块转换为 (NS)StringNSISOLatin1StringEncoding 将包含嵌入式 NUL 和控制字符。某些函数的行为出乎意料 当与这样的字符串一起使用时。例如,NSLog() 终止 在第一个嵌入的 NUL 字符处输出。这种转换 旨在解决OP的具体问题(创建一个QR码 被第 3 方应用程序识别)。这并不意味着 一种将任意数据转换为字符串的通用机制 以任何方式打印或呈现给用户。