Search code examples
iosswiftcore-bluetooth

Converting byte value correctly


I am having a hard time getting the correct value that I need. I get from my characteristic vales from:

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

I can read and print off the values with:

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

This gets me:

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

The problem is that the temp is not 46. Below is a snippet of instructions on how I need to convert the byte to get the actual temp. The actual temp was around 558 ºF. Here are a part of the instructions:

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);

I can't seem to get the correct temp? Please let me know what I am doing wrong.


Solution

  • According to the description, value[1] ... value[4] are the least significant to most significant bytes of the (32-bit integer) temperature, so this is how you would recreate that value from the bytes:

    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)
    }
    

    The bit-fiddling is done in unsigned integer arithmetic to avoid an overflow. Assuming that the temperature is a signed value, this value is then converted to a signed integer with the same bit representation.