这里有一个更通用的、"纯Swift"的方法(不需要Foundation :-))
extension UnsignedInteger {
var hex: String {
var str = String(self, radix: 16, uppercase: true)
while str.characters.count < 2 * MemoryLayout<Self>.size {
str.insert("0", at: str.startIndex)
}
return str
}
}
extension Array where Element: UnsignedInteger {
var hex: String {
var str = ""
self.forEach { (u) in
str.append(u.hex)
}
return str
}
}
let str = [UInt8(1),22,63,41].hex
let str2 = [UInt(1),22,63,41].hex
extension String {
func toUnsignedInteger<T:UnsignedInteger>()->[T]? {
var ret = [T]()
let nibles = MemoryLayout<T>.size * 2
for i in stride(from: 0, to: characters.count, by: nibles) {
let start = self.index(startIndex, offsetBy: i)
guard let end = self.index(start, offsetBy: nibles, limitedBy: endIndex),
let ui = UIntMax(self[start..<end], radix: 16) else { return nil }
ret.append(T(ui))
}
return ret
}
}
let u0:[UInt8]? = str.toUnsignedInteger()
let u1 = "F2345f".toUnsignedInteger() as [UInt8]?
let u2 = "12345f".toUnsignedInteger() as [UInt16]?
let u3 = "12345g".toUnsignedInteger() as [UInt8]?
let u4 = "12345f".toUnsignedInteger() as [UInt]?
let u5 = "12345678".toUnsignedInteger() as [UInt8]?
let u6 = "12345678".toUnsignedInteger() as [UInt16]?
let u7 = "1234567812345678".toUnsignedInteger() as [UInt]?
对于SignedInteger来说,做同样的事情也非常容易,但更好的方法是将结果映射到有符号类型
let u8 = u1?.map { Int8(bitPattern: $0) } // [-14, 52, 95]