C/C++语言实现16进制数转float(电子罗盘TCM数据读取)

最近需要获取TCM的姿态数据,并计算出相应的姿态角。TCM的姿态数据具有20字节,每个字节用十六进制表示,数据格式如下:
这里写图片描述
根据上图描述的数据格式,就能提取出三个姿态角。提取步骤如下:
(1)首先将数据反向存储(考虑字节序),比如heading的四个字节数据依次为”0x1A,0x2B,0x3C,0x4D”,那么hedaing角度数据用“0x4D,0x3C,0x2B,0x1A”来表示.
(2)将步骤(1)得到的反转数据(4个字节的16进制数),即32位二进制数,转化为float型数据,就可得到heading的角度值。
比如获取到的一条iTCM的十六进制数据如下:
“15 05 03 05 43 68 85 F7 18 43 41 8B B0 19 43 19 A8 77”
提取heading的c程序如下:

//char recvbuf[20];                 //recvbuf存储的是上述对于的字符串数据
int k=0;
unsigned char c_heading[4];
float f_heading=0;
for(;k<4;k++)
    c_heading[k]=recvbuf[7-k];
f_heading=*((float*)(c_heading));  //得到heading角度值

下面介绍一下IEEE 32位float数据格式
对于float型数据的数值,并不能通过二进制表示直接得到,而是需要经过一定的运算。
32位float数据格式如下:
这里写图片描述
含义如下:
C/C++语言实现16进制数转float(电子罗盘TCM数据读取)_第1张图片
计算方法如下:
(1)首先看符号位,此例中为1,表示数为负;
(2)接着观察带符号的阶码,共8位,计算对应的十进制数,此例中为128。用128-127=1。表示最终要将尾数的小数点向右移1位。若为负,则向左移。
(3)尾数:本例中尾数为 110 1101 0101 1011 1000 0001。首先在数据首端补齐隐藏位“1”,从而为:
1110 1101 0101 1011 1000 0001。初始时小数点的位置在刚补齐的位置后,即:
1.110 1101 0101 1011 1000 0001。
接着,根据(2),小数点右移一位,变为:11.10 1101 0101 1011 1000 0001
计算得到最终数据:
2^1+2^0.2^(-1)+2^(-3)+2^(-4)+2^(-6)+2^(-8)+2^(-10)+2^(-11)+2^(-13)+2^(-14)+2^(-22)

你可能感兴趣的:(c语言,姿态传感器,16进制转float,float数据格式,单精度浮点型)