在我的项目中,我与蓝牙设备通信,蓝牙设备必须向我发送一个时间戳记秒,以字节为单位:
[2,6,239]
当我转换为字符串时:
let payloadString = payload.map {
String(format: "%02x", $0)
}
输出:
["02", "06","ef"]
当我从website 0206ef = 132847秒转换时
如何在秒钟(= 132847秒)内直接转换我的求救[2,6,239]
?
如果很复杂,请在秒钟(= 132847秒)内转换我的数组["02", "06,"ef"]
答案 0 :(得分:2)
有效负载包含值的二进制表示形式的字节。 您可以通过将每个字节移到相应的位置来将其转换回该值:
let payload: [UInt8] = [2, 6, 239]
let value = Int(payload[0]) << 16 + Int(payload[1]) << 8 + Int(payload[2])
print(value) // 132847
重要的一点是在移位之前将字节转换为整数 ,否则会发生溢出错误。或者, 乘法:
let value = (Int(payload[0]) * 256 + Int(payload[1])) * 256 + Int(payload[2])
或
let value = payload.reduce(0) { $0 * 256 + Int($1) }
最后一种方法适用于任意数量的字节-只要
结果适合Int
。对于4 ... 8个字节,您最好选择UInt64
为了避免溢出错误:
let value = payload.reduce(0) { $0 * 256 + UInt64($1) }
答案 1 :(得分:1)
payloadString
字符串可以减少为hexStr
,然后转换为十进制
var payload = [2,6,239];
let payloadString = payload.map {
String(format: "%02x", $0)
}
//let hexStr = payloadString.reduce(""){$0 + $1}
let hexStr = payloadString.joined()
if let value = UInt64(hexStr, radix: 16) {
print(value)//132847
}