如何快速将数据转换为十六进制字符串
我想要Swift中Data值的十六进制表示。
最终,我想像这样使用它:
let data = Data(base64Encoded: "aGVsbG8gd29ybGQ=")!print(data.hexString)
回答:
一种替代实现(取自“ 如何使用
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)
}
}
以上是 如何快速将数据转换为十六进制字符串 的全部内容, 来源链接: utcz.com/qa/416959.html