Ios UInt8异或';d数组结果到NSString的转换每次都返回nil

Ios UInt8异或';d数组结果到NSString的转换每次都返回nil,ios,string,swift,utf-8,xor,Ios,String,Swift,Utf 8,Xor,我在使用iOS Swift 2.0对[UInt8]执行异或并将异或结果转换为字符串时遇到问题。我必须与一个粗糙的服务器接口,该服务器希望使用预定义的UInt8值数组执行简单的异或加密,并将结果作为字符串返回 使用iOS Swift 2.0游乐场创建以下阵列: let xorResult : [UInt8] = [24, 48, 160, 212] // XORd result let result = NSString(bytes: xorResult, length: xorResult.

我在使用iOS Swift 2.0对[UInt8]执行异或并将异或结果转换为字符串时遇到问题。我必须与一个粗糙的服务器接口,该服务器希望使用预定义的UInt8值数组执行简单的异或加密,并将结果作为字符串返回

使用iOS Swift 2.0游乐场创建以下阵列:

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,然后尝试将其转换为NSUTF8STRINGENCONDING,但在删除160和212之前仍然为零。我知道这个算法在Java中有效,但是在Java中我们使用了char和StringBuilder的组合,一切都很好。在iOS Swift中有没有办法解决这个问题?

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

具有此属性的最简单编码是ISO Latin 1 aka ISO 8859-1,即 补充C0和C1控制代码时进行编码。 它映射Unicode代码点
U+0000。。U+00FF
到字节
0x00。。0xFF
(比较)

此编码可用于
(NS)字符串
nsisolatin1stringecoding

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

24、48、160、212
不是有效的UTF-8序列。您(或服务器)希望得到什么字符串作为结果?只是XORd结果的字符串表示。我们必须与之接口的应用程序使用XOR结果作为“加密”来构建二维码。他们为我们提供了一个类似于以下内容的数组,只是更大一些:private let encryptable:[UInt8]=[0x39、0x56、0x5F、0xD3、0xBC、0x67、0xA7、0xCF]我必须随机化此数组中的索引,然后从encryptTable中对字符串值中的每个字符执行XOR。改为尝试
NSASCIIStringEncoding
。@luk2302这是修复方法。非常感谢。将您的评论作为答案,我将投票表决。NSASCIIStringEncoding正式仅为7位编码,但其行为类似于NSISOLatin1StringEncoding和8位输入(此处观察:),因此我建议使用后者。请注意,
0x00
-
0x1f
0x7f
-
0x9f
范围内的ISO/IEC 8859-1编码字符未定义,可能无法映射可打印字符。