正确转换字节值

时间:2018-04-25 17:13:03

标签: ios swift core-bluetooth

我很难获得所需的正确价值。 我从我的特色词汇中得到:

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor ...

我可以通过以下方式阅读和打印这些值:

let values = characteristic.value
for val in values! {
    print("Value", num)
}

这让我:

"Value 0" // probe state not important
"Value 46" // temp 
"Value 2" // see below

问题是temp不是46。 下面是我需要如何转换字节以获取实际温度的指令片段。 实际温度约为558ºF。 以下是说明的一部分:

Description: temperature data that is valid only if the temperature stat is normal
byte[1] = (unsigned char)temp;
byte[2] = (unsigned char)(temp>>8);
byte[3] = (unsigned char)(temp>>16);
byte[4] = (unsigned char)(temp>>24);

我似乎无法获得正确的温度?请让我知道我做错了什么。

2 个答案:

答案 0 :(得分:2)

说明书告诉你答案。您在字节1中获得46,然后在字节2中获得2。指令说单独留下字节1,但对于字节2,我们将结果移至temp>>8 - 这意味着&#34;乘以256&#34; (因为2^8256)。 <嗯,什么是

46+256×2

它是558,只是我们正在寻找的结果。

答案 1 :(得分:2)

根据描述,value[1] ... value[4]对于(32位整数)温度的最高有效字节最不重要,所以这就是你重新创建的方式 来自字节的值:

if let value = characteristic.value, value.count >= 5 {
    let tmp = UInt32(value[1]) + UInt32(value[2]) << 8 + UInt32(value[3]) << 16 + UInt32(value[4]) << 24
    let temperature = Int32(bitPattern: tmp)
}

bit-fiddling是用无符号整数运算来避免的 溢出。假设温度是签名的值, 然后将此值转换为具有相同的有符号整数 位表示。