在工作中遇到了在IEEE754标准下将十六进制数据转为浮点数,在网上没看到相关的代码,因此在此处记录一下。下面是传感器传输的四组数据:
1.第一种方式是按照位操作的方式,对接收的数据进行移位和乘除最后还原成float型数据,代码如下:
float Byte_To_flaot(unsigned char *buf)
{
unsigned char s; //符号位
unsigned char DataEx,data1,data2; //指数位
unsigned char M=0;
float sum1=0,sum2=0,sum3=0;
float sum=0;
unsigned char b,c,d;
int buffer=0;
unsigned char buf1=0; //清除s位
s=buf[0]>>7;
DataEx=(buf[0]<<1)+(buf[1]>>7);
M=DataEx-127;
buf[1]=buf[1]&0x7F; //清空e0位
for(unsigned char i=0;i<8;i++)
{
b=(buf[1]&(0x80>>i))>>(7-i);
c=(buf[2]&(0x80>>i))>>(7-i);
d=(buf[3]&(0x80>>i))>>(7-i);
sum1+=b*pow(2,M-i)+c*pow(2,M-i-8)+d*pow(2,M-i-16);
}
sum=sum1+pow(2,M);
if (s == 1) sum=-sum;
return sum;
}
2.第二种方式更为简单,采用联合体就可以了。
首先定义一个如下的联合体:
typedef union {
unsigned char s[4];
float rec;
}Ubytefloat;
然后将接收的四组数据赋给联合体当中的数组就可以了,但是要注意一下赋值的顺序:
比如21.6对应的十六进制就是四组数据0x41,0xac,0xcc,0xcc。这里需要将0xcc赋值给s[0],0xcc赋值给s[1],0xac赋值给s[2],0x41赋值给s[3]。即数组的四个程序和四组数据是倒着对应的。
将数据填入数组后,直接读取float成员即可获得转换后的值。