You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:43:52