加速度计数据从十六进制到浮点



我正试图从不良记录的BLE信标上获得加速度计数据。这是我收到的(作为NSDictionary):

{
"x-Data" = 0020;
"y-Data" = 0000;
"z-Data" = 0BEC;
}

…我想不出它应该是什么意思。加速度计有一个刻度设置。本例中的刻度设置为+-2g。因此,我期望上面收到的值应该是[-1,1],并乘以刻度以获得实际测量值。

我把加速度计平放在桌子上获取数据;我期望值应该是x=0,y=0z=-0.5-因为乘以尺度(2g)得到z=-1g=重力。

我收到的数据是2字节。它是一个半浮动格式(Float16)?但是试图转换这个是不好的:

let u = UInt16("0BEC", radix: 16)! // 3052
Float16(bitPattern: u) // 0.0002418

转换错了吗?

我已经猜测了一段时间的格式。你能帮我弄清楚是什么格式吗?

这是一个稍微大一点的值集,加速度计放在桌子上:

{
"x-Data" = 001C;
"y-Data" = 0FFC;
"z-Data" = 0BEC;
}
{
"x-Data" = 0020;
"y-Data" = 0FFC;
"z-Data" = 0BE8;
}
{
"x-Data" = 001C;
"y-Data" = 0000;
"z-Data" = 0BE8;
}
{
"x-Data" = 001C;
"y-Data" = 0FFC;
"z-Data" = 0BEC;
}
{
"x-Data" = 0020;
"y-Data" = 0000;
"z-Data" = 0BEC;
}

在玩了几个小时后,终于写下了这个问题,我找到了我自己问题的答案,尽管我仍然想要一个解释。

我发现,如果我把最后一位数字(总是0)移到前面,我就会得到正确的答案:

let acc = UInt16("BEC0", radix: 16)! // Use BEC0 instead of 0BEC
let accs = Int16(bitPattern: acc)
Double(accs) / Double(32767) // - 0.5 as desired

我真的不知道为什么加速度计数据是这种格式。我得到它只是将原始数据转换为NSDictionary。可能是信标固件的bug。