Swift
整型轉 Data:
接口
/// Initialize a `Data` with the contents of an Array.
///
/// - parameter bytes: An array of bytes to copy.
public init(bytes: [UInt8])
使用
let data = Data(bytes: [11, 011, 0x11])
十六進制字符串 轉 Data:
//將十六進制字符串轉化為 Data
func data(from hexStr: String) -> Data {
let bytes = self.bytes(from: hexStr)
return Data(bytes: bytes)
}
// 將16進制字符串轉化為 [UInt8]
// 使用的時候直接初始化出 Data
// Data(bytes: Array<UInt8>)
func bytes(from hexStr: String) -> [UInt8] {
assert(hexStr.count % 2 == 0, "輸入字符串格式不對,8位代表一個字符")
var bytes = [UInt8]()
var sum = 0
// 整形的 utf8 編碼范圍
let intRange = 48...57
// 小寫 a~f 的 utf8 的編碼范圍
let lowercaseRange = 97...102
// 大寫 A~F 的 utf8 的編碼范圍
let uppercasedRange = 65...70
for (index, c) in hexStr.utf8CString.enumerated() {
var intC = Int(c.byteSwapped)
if intC == 0 {
break
} else if intRange.contains(intC) {
intC -= 48
} else if lowercaseRange.contains(intC) {
intC -= 87
} else if uppercasedRange.contains(intC) {
intC -= 55
} else {
assertionFailure("輸入字符串格式不對,每個字符都需要在0~9,a~f,A~F內")
}
sum = sum * 16 + intC
// 每兩個十六進制字母代表8位,即一個字節
if index % 2 != 0 {
bytes.append(UInt8(sum))
sum = 0
}
}
return bytes
}
Data 轉 String:
func string(from data: Data) -> String {
return String(format: "%@", data as CVarArg)
}
十六進制 轉 整形:
func integer(from hexStr: String) -> Int {
var sum = 0
// 整形的 utf8 編碼范圍
let intRange = 48...57
// 小寫 a~f 的 utf8 的編碼范圍
let lowercaseRange = 97...102
// 大寫 A~F 的 utf8 的編碼范圍
let uppercasedRange = 65...70
for c in hexStr.utf8CString {
var intC = Int(c.byteSwapped)
if intC == 0 {
break
} else if intRange.contains(intC) {
intC -= 48
} else if lowercaseRange.contains(intC) {
intC -= 87
} else if uppercasedRange.contains(intC) {
intC -= 55
} else {
assertionFailure("輸入字符串格式不對,每個字符都需要在0~9,a~f,A~F內")
}
sum = sum * 16 + intC
}
return sum
}