您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何快速将数据转换为十六进制字符串

如何快速将数据转换为十六进制字符串

一种替代实现(取自“ 如何使用 Swift 将字符串加密到sha1 ?,并带有大写 输出的附加选项)”

extension Data {
    struct HexEncodingOptions: OptionSet {
        let rawValue: Int
        static let upperCase = HexEncodingOptions(rawValue: 1 << 0)
    }

    func hexEncodedString(options: HexEncodingOptions = []) -> String {
        let format = options.contains(.upperCase) ? "%02hhX" : "%02hhx"
        return map { String(format: format, $0) }.joined()
    }
}

hexEncodedString(options:)按照现有 方法的样式选择了一种方法base64EncodedString(options:)

Data符合Collection协议,因此可以使用map()将 每个字节映射到相应的十六进制字符串。该%02x格式 以16为基数打印自变量,如有必要,最多填充两位数,并以前导零表示。 的hh改性剂引起的参数(其为上的整数传递 堆栈)被当作一个字节的数量。此处可以省略修饰符, 因为它$0是一个无符号的数字(UInt8),并且不会出现符号扩展名 ,但是将其保留在其中也无害。

然后将结果连接到单个字符串。

例:

let data = Data(bytes: [0, 1, 127, 128, 255])
print(data.hexEncodedString()) // 00017f80ff
print(data.hexEncodedString(options: .upperCase)) // 00017F80FF

以下实现速度提高了约120倍(使用1000个 随机字节进行了测试)。它类似于RenniePet的 解决方案和Nick Moore的 解决方案,但是基于UTF-16 代码单元,Swift字符串(当前)用作内部存储。

extension Data {
    struct HexEncodingOptions: OptionSet {
        let rawValue: Int
        static let upperCase = HexEncodingOptions(rawValue: 1 << 0)
    }

    func hexEncodedString(options: HexEncodingOptions = []) -> String {
        let hexDigits = Array((options.contains(.upperCase) ? "0123456789ABCDEF" : "0123456789abcdef").utf16)
        var chars: [unichar] = []
        chars.reserveCapacity(2 * count)
        for byte in self {
            chars.append(hexDigits[Int(byte / 16)])
            chars.append(hexDigits[Int(byte % 16)])
        }
        return String(utf16CodeUnits: chars, count: chars.count)
    }
}
其他 2022/1/1 18:13:44 有712人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶