gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:58:52 24 4
gpt4 key购买 nike

我想要 Swift 中数据值的十六进制表示。

最终我想像这样使用它:

let data = Data(base64Encoded: "aGVsbG8gd29ybGQ=")!
print(data.hexString)

最佳答案

一个简单的实现(取自 How to hash NSString with SHA1 in Swift? ,带有大写输出的附加选项)将是

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 self.map { String(format: format, $0) }.joined()
}
}
我选择了现有方法 hexEncodedString(options:) 风格的 base64EncodedString(options:) 方法。 Data 符合 Collection 协议(protocol),因此可以使用 map() 将每个字节映射到相应的十六进制字符串。 %02x 格式以 16 为基数打印参数,最多填充两位数
必要时带前导零。 hh 修饰符导致参数
(在堆栈上作为整数传递)被视为一个字节
数量。在这里可以省略修饰符,因为 $0 是无符号的
number ( UInt8 ) 并且不会发生符号扩展,但离开并没有什么害处
它在。
然后将结果连接到单个字符串。
例子:
let data = Data([0, 1, 127, 128, 255])
// For Swift < 4.2 use:
// let data = Data(bytes: [0, 1, 127, 128, 255])
print(data.hexEncodedString()) // 00017f80ff
print(data.hexEncodedString(options: .upperCase)) // 00017F80FF

以下实现快了大约 50 倍
(用 1000 个随机字节测试)。它的启发是
RenniePet's solution
Nick Moore's solution ,但利用
String(unsafeUninitializedCapacity:initializingUTF8With:)
它是随 Swift 5.3/Xcode 12 引入的,可在 macOS 11 和 iOS 14 或更高版本上使用。
此方法允许有效地从 UTF-8 单元创建 Swift 字符串,而无需进行不必要的复制或重新分配。
还提供了旧 macOS/iOS 版本的替代实现。
extension Data {
struct HexEncodingOptions: OptionSet {
let rawValue: Int
static let upperCase = HexEncodingOptions(rawValue: 1 << 0)
}

func hexEncodedString(options: HexEncodingOptions = []) -> String {
let hexDigits = options.contains(.upperCase) ? "0123456789ABCDEF" : "0123456789abcdef"
if #available(macOS 11.0, iOS 14.0, watchOS 7.0, tvOS 14.0, *) {
let utf8Digits = Array(hexDigits.utf8)
return String(unsafeUninitializedCapacity: 2 * self.count) { (ptr) -> Int in
var p = ptr.baseAddress!
for byte in self {
p[0] = utf8Digits[Int(byte / 16)]
p[1] = utf8Digits[Int(byte % 16)]
p += 2
}
return 2 * self.count
}
} else {
let utf16Digits = Array(hexDigits.utf16)
var chars: [unichar] = []
chars.reserveCapacity(2 * self.count)
for byte in self {
chars.append(utf16Digits[Int(byte / 16)])
chars.append(utf16Digits[Int(byte % 16)])
}
return String(utf16CodeUnits: chars, count: chars.count)
}
}
}

关于swift - 如何快速将数据转换为十六进制字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59398245/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com