Swift中加密后Array<UInt8>转String返回nil问题求助
解决Swift中加密字节转字符串返回nil的问题
嘿,这个问题我之前也碰到过!核心原因很简单:加密后的二进制数据(也就是你的ciphertext)并不是有效的UTF-8编码内容。UTF-8是用来表示人类可读文本的编码规则,而加密输出的是随机的二进制流,几乎不可能刚好符合UTF-8的编码规范,所以直接用String.Encoding.utf8转换自然会得到nil。
下面给你两种常用的解决方案,都是专门用来把二进制数据转换成可打印字符串的:
方案1:转Base64字符串(最常用)
Base64是业界通用的二进制转字符串方案,Swift里用Data的内置方法就能轻松实现:
// 你的加密代码 let ciphertext = try aes.encrypt(Array("Password123".utf8)) // 先把字节数组转成Data类型 let cipherData = Data(ciphertext) // 转换为Base64字符串 let base64CipherStr = cipherData.base64EncodedString() print("Base64 cipherStr: \(base64CipherStr)") // 如果之后需要还原回二进制数据 if let decodedData = Data(base64Encoded: base64CipherStr) { let decodedBytes = Array(decodedData) print("还原后的字节数组: \(decodedBytes)") }
方案2:转十六进制字符串(和NSData输出格式一致)
如果你想要得到和NSData输出的<94b131c1 64b8e833 1aaa9272 4df41dac>格式对应的纯字符串,可以给Data写个扩展方法:
// 给Data扩展一个转十六进制字符串的方法 extension Data { var hexString: String { // 把每个字节转成两位的十六进制字符串,再拼接起来 return self.map { String(format: "%02x", $0) }.joined() } } // 你的加密代码 let ciphertext = try aes.encrypt(Array("Password123".utf8)) let cipherData = Data(ciphertext) // 转换为十六进制字符串(小写) let hexCipherStr = cipherData.hexString print("Hex cipherStr: \(hexCipherStr)") // 输出: 94b131c164b8e8331aaa92724df41dac // 补充:从十六进制字符串还原回Data的扩展方法 extension String { var hexToData: Data? { var data = Data() let charPairs = stride(from: 0, to: self.count, by: 2).map { String(self[self.index(self.startIndex, offsetBy: $0)..<self.index(self.startIndex, offsetBy: $0+2)]) } for pair in charPairs { guard let byte = UInt8(pair, radix: 16) else { return nil } data.append(byte) } return data } } // 还原示例 if let decodedData = hexCipherStr.hexToData { let decodedBytes = Array(decodedData) print("还原后的字节数组: \(decodedBytes)") }
再啰嗦两句
- 记住:只有原本就是文本的二进制数据(比如你加密前的
"Password123".utf8),才能直接用UTF-8编码转成字符串。随机的二进制数据(比如加密结果、图片数据)必须用Base64或十六进制这种专门的编码方式转换。 - Base64的优势是兼容性好、字符串长度相对短;十六进制的优势是可读性强,和调试时看到的二进制数据格式一致,你可以根据自己的需求选。
内容的提问来源于stack exchange,提问作者A1ucard
相关产品推荐
相关产品推荐

