与ble数据交互时常常需要数据转换,留下笔记做记录。
1、十六进制转成字符串输出显示
let k :UInt16 = 2 << 8 | 3
let convert = String(k,radix:16);
2、蓝牙返回数据两个字节表示一个数字
var datas = [UInt8]()
let a = UInt16(datas[0]) << 8 & 0xff00
let b = UInt16(datas[1]) & 0x00ff
let k :UInt16 = a | b
3、大端转小端
static func dataTransfromsBigOrSmall(_ data:Data) ->Data? {
let a_str = data.hexString()
var ary = [String]()
**var** index = 0
**for** _ **in** 0..<data.count {
**let** index1 = String.Index(utf16Offset: index, in: a_str)
**let** index2 = String.Index(utf16Offset: index + 2, in: a_str)
**let** range = index1..<index2
**let** str = String(a_str[range])
ary.append(str)
index += 2
}
**var** n_str = String()
**for** i **in** ary.reversed().enumerated() {
n_str += "\(i.element)"
}
**let** s_data = n_str.hexData()
**return** s_data
}
4、Data转16进制字符串
func hexString() -> String {
return map { String(format: "%02x", $0) }.joined(separator: "").uppercased()
}
5、16进制字符串转Data
**func** hexData() -> Data? {
**var** data = Data(capacity: count / 2)
**let** regex = **try**! NSRegularExpression(pattern: "[0-9a-f]{1,2}", options: .caseInsensitive)
regex.enumerateMatches(in: **self**, range: NSMakeRange(0, utf16.count)) { match, flags, stop **in**
**let** byteString = (**self** **as** NSString).substring(with: match!.range)
**var** num = UInt8(byteString, radix: 16)!
data.append(&num, count: 1)
}
**guard** data.count > 0 **else** { **return** **nil** }
**return** data
}
6、十六进制数转十进制
**static** **func** hexadecimalToDecimal(num:String) -> Int {
**let** str = num.uppercased()
**var** sum = 0
**for** i **in** str.utf8 {
sum = sum * 16 + Int(i) - 48 // 0-9 从48开始
**if** i >= 65 {// A-Z 从65开始,但有初始值10,所以应该是减去55
sum -= 7
}
}
**return** sum
}