Swift:字节数组转换为十进制值

时间:2018-11-15 07:44:12

标签: swift bluetooth-lowenergy byte

在我的项目中,我与蓝牙设备通信,蓝牙设备必须向我发送一个时间戳记秒,以字节为单位:

[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"]

2 个答案:

答案 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
}