Python 有两个非常有用的库方法(binascii.a2b_hex(keyStr) 和 binascii.hexlify(keyBytes)),我在 Swift 中一直在努力解决它们。 Swift 中有什么现成的东西吗?如果没有,又该如何实施呢?考虑到所有边界和其他检查(例如偶数长度密钥)均已完成。
Data
从 Swift 3 开始,没有“内置”方法来将其内容打印为
一个十六进制字符串,或者创建一个Data
来自十六进制字符串的值。
可以找到“数据到十六进制字符串”方法,例如在如何在 swift 中将数据转换为十六进制字符串 or 如何使用 Swift 打印 Data 类型变量的内容? or 在 swift 3.0 中将字符串转换为数据。这是第一个链接的实现:
extension Data {
func hexEncodedString() -> String {
return map { String(format: "%02hhx", $0) }.joined()
}
}
这是反向“十六进制字符串到数据”的可能实现
转换(取自十六进制字符串到字节 (NSData)代码审查,翻译为 Swift 3 并改进)
作为一个失败的初始化器:
extension Data {
init?(fromHexEncodedString string: String) {
// Convert 0 ... 9, a ... f, A ...F to their decimal value,
// return nil for all other input characters
func decodeNibble(u: UInt8) -> UInt8? {
switch(u) {
case 0x30 ... 0x39:
return u - 0x30
case 0x41 ... 0x46:
return u - 0x41 + 10
case 0x61 ... 0x66:
return u - 0x61 + 10
default:
return nil
}
}
self.init(capacity: string.utf8.count/2)
var iter = string.utf8.makeIterator()
while let c1 = iter.next() {
guard
let val1 = decodeNibble(u: c1),
let c2 = iter.next(),
let val2 = decodeNibble(u: c2)
else { return nil }
self.append(val1 << 4 + val2)
}
}
}
Example:
// Hex string to Data:
if let data = Data(fromHexEncodedString: "0002468A13579BFF") {
let idata = Data(data.map { 255 - $0 })
// Data to hex string:
print(idata.hexEncodedString()) // fffdb975eca86400
} else {
print("invalid hex string")
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)