Swift 将十六进制字符串或字符转换为整数
Swift Convert Hex String or Character to Integer
我有一个数据源向我传递一个十六进制字符串(例如 11C01),我需要将其中的每个字符转换为整数或字节值,以便我可以将其用作位域(即做value | 0x01 == 0 之类的东西,就像你在旧的 C 风格位域中所做的那样)。语言为 Swift.
在我的一生中,我无法找到一种方法将包含十六进制值的字符转换为整数,而无需进行一些奇怪的循环,将其放入 NSData 然后从那里转换它或使用 C 在 Objective-C class。只是在 Swift 中寻找一些东西来做这个而不是求助于那个。
示例字符串是这样的:11C01
我需要它来创建这样的字节或整数数组:0x1, 0x1, 0xC, 0x0, 0x1.
输出应该是一个 int 或 byte,我可以对其进行按位运算。
我该怎么做?
提前致谢!
edit/update:
Swift 5 或更高版本你可以使用 Character 属性 hexDigitValue:
let hexaString = "11C01"
let integers = hexaString.compactMap(\.hexDigitValue)
let bytes = integers.map(UInt8.init)
let hexaArray = hexaString.map { "0x" + String([=10=]) }
print(integers) // "[1, 1, 12, 0, 1]"
print(bytes) // "[1, 1, 12, 0, 1]"
print(hexaArray) // "["0x1", "0x1", "0xC", "0x0", "0x1"]\n"
将每 2 个字符转换为一个字节(十六进制到字节):
extension Collection {
func unfoldSubSequences(limitedTo maxLength: Int) -> UnfoldSequence<SubSequence,Index> {
sequence(state: startIndex) { start in
guard start < self.endIndex else { return nil }
let end = self.index(start, offsetBy: maxLength, limitedBy: self.endIndex) ?? self.endIndex
defer { start = end }
return self[start..<end]
}
}
}
extension StringProtocol {
var byte: UInt8? { UInt8(self, radix: 16) }
var hexaToBytes: [UInt8] { unfoldSubSequences(limitedTo: 2).compactMap(\.byte) }
var hexaToData: Data { .init(hexaToBytes) }
}
"11C011".hexaToBytes // [17, 192, 17]
"11C011".hexaToData // 3 bytes
[0x11, 0xC0, 0x11] // [17, 192, 17]
出于娱乐而非清晰的目的:
let hex_string = "11C01"
let result = map(hex_string.utf8) {
[=10=] & 0xf + [=10=] >> 6 | ([=10=] & 0x40) >> 3
}
// result: UInt8 array: [1, 1, 12, 0, 1]
let int_value = UInt64("11c01", radix: 16)
然后可以移出位
注意:确保数据类型可以容纳值
我有一个数据源向我传递一个十六进制字符串(例如 11C01),我需要将其中的每个字符转换为整数或字节值,以便我可以将其用作位域(即做value | 0x01 == 0 之类的东西,就像你在旧的 C 风格位域中所做的那样)。语言为 Swift.
在我的一生中,我无法找到一种方法将包含十六进制值的字符转换为整数,而无需进行一些奇怪的循环,将其放入 NSData 然后从那里转换它或使用 C 在 Objective-C class。只是在 Swift 中寻找一些东西来做这个而不是求助于那个。
示例字符串是这样的:11C01 我需要它来创建这样的字节或整数数组:0x1, 0x1, 0xC, 0x0, 0x1.
输出应该是一个 int 或 byte,我可以对其进行按位运算。
我该怎么做?
提前致谢!
edit/update:
Swift 5 或更高版本你可以使用 Character 属性 hexDigitValue:
let hexaString = "11C01"
let integers = hexaString.compactMap(\.hexDigitValue)
let bytes = integers.map(UInt8.init)
let hexaArray = hexaString.map { "0x" + String([=10=]) }
print(integers) // "[1, 1, 12, 0, 1]"
print(bytes) // "[1, 1, 12, 0, 1]"
print(hexaArray) // "["0x1", "0x1", "0xC", "0x0", "0x1"]\n"
将每 2 个字符转换为一个字节(十六进制到字节):
extension Collection {
func unfoldSubSequences(limitedTo maxLength: Int) -> UnfoldSequence<SubSequence,Index> {
sequence(state: startIndex) { start in
guard start < self.endIndex else { return nil }
let end = self.index(start, offsetBy: maxLength, limitedBy: self.endIndex) ?? self.endIndex
defer { start = end }
return self[start..<end]
}
}
}
extension StringProtocol {
var byte: UInt8? { UInt8(self, radix: 16) }
var hexaToBytes: [UInt8] { unfoldSubSequences(limitedTo: 2).compactMap(\.byte) }
var hexaToData: Data { .init(hexaToBytes) }
}
"11C011".hexaToBytes // [17, 192, 17]
"11C011".hexaToData // 3 bytes
[0x11, 0xC0, 0x11] // [17, 192, 17]
出于娱乐而非清晰的目的:
let hex_string = "11C01"
let result = map(hex_string.utf8) {
[=10=] & 0xf + [=10=] >> 6 | ([=10=] & 0x40) >> 3
}
// result: UInt8 array: [1, 1, 12, 0, 1]
let int_value = UInt64("11c01", radix: 16)
然后可以移出位
注意:确保数据类型可以容纳值