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数据格式如下:
这里写图片描述
含义如下:
这里写图片描述
计算方法如下:
(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)

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值