UInt8 XOR'd数组结果到NSString的转换每次都返回nil

我遇到的问题与iOS Swift 2.0在[UInt8]上执行XOR并将XORd结果转换为string。 我不得不与一个粗糙的服务器进行交互,该服务器想要使用预定义的UInt8值数组进行简单的XORencryption,并将结果作为string返回。

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

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

结果总是零。 如果从数组中删除160和212的值,NSString不是零。 如果我切换到NSUTF16StringEncoding然后我不收到零,但是,服务器不支持UTF16。 我已经尝试将值转换为hexstring,然后将hexstring转换为NSData,然后尝试将其转换为NSUTF8StringEncoding,但仍然零,直到我删除了160和212.我知道这个algorithm在Java中工作,但是在Java中,重新使用char和StringBuilder的组合,一切都很开心。 有没有在iOS Swift中解决这个问题的方法?

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

具有这个属性的最简单的编码是ISO拉丁1又名ISO 8859-1,当用C0和C1控制代码补充时,是ISO / IEC 8859-1编码。 它将Unicode代码点U+0000 .. U+00FF映射到字节0x00 .. 0xFF (比较8859-1.TXT )。

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

请注意:使用NSISOLatin1StringEncoding将任意二进制块转换为(NS)StringNSISOLatin1StringEncoding将包含embedded的NUL和控制字符。 与这样的string一起使用时,某些函数会出现意外的行为。 例如, NSLog()终止输出在第一个embedded的NUL字符。 这个转换是为了解决OP的具体问题(创build一个由第三方应用程序识别的QR码)。 这并不意味着将任意数据转换为可以打印或以任何方式呈现给用户的string的通用机制。

Interesting Posts