C语言中对于float类型的数据,主要使用4字节进行存储,以下为干货。实现四字节与浮点数之间的转换。
0.头文件添加
#include <math.h>
1.浮点数转换为四字节
void FloatToByte(float floatNum,unsigned char* byteArry)
{
char* pchar=(char*)&floatNum;
for(int i=0;i<4;i++)
{
*byteArry=*pchar;
pchar++;
byteArry++;
}
}
2.四字节转换为浮点数
typedef unsigned char byte;
float b2f(byte m0, byte m1, byte m2, byte m3)
{
// 求符号位
float sig = 1.;
if (m0 >=128.)
sig = -1.;
//求阶码
float jie = 0.;
if (m0 >=128.)
{
jie = m0-128. ;
}
else
{
jie = m0;
}
jie = jie * 2.;
if (m1 >=128.)
jie += 1.;
jie -= 127.;
//求尾码
float tail = 0.;
if (m1 >=128.)
m1 -= 128.;
tail = m3 + (m2 + m1 * 256.) * 256.;
tail = (tail)/8388608; // 8388608 = 2^23
float f = sig * pow(2., jie) * (1+tail);
return f;
}
3.main函数进行测试
int main(void)
{
log_init();
while(1)
{
float c=0.04;
unsigned char bcd[4]={0x0A, 0xD7, 0x23, 0x3D};
FloatToByte(c,bcd);
NRF_LOG_INFO("%x %x %x %x\r\n",bcd[0],bcd[1],bcd[2],bcd[3]);
float q=b2f(0xBB, 0x23, 0xD7, 0x0A);//反向
NRF_LOG_INFO("float NUM1 is :"NRF_LOG_FLOAT_MARKER"\r\n",NRF_LOG_FLOAT(q));
q=b2f(0x3D, 0x23, 0xD7, 0x0A);//反向
NRF_LOG_INFO("float NUM2 is :"NRF_LOG_FLOAT_MARKER"\r\n",NRF_LOG_FLOAT(q));
nrf_delay_ms(1000);
}
return 0;
}
其中浮点数测试为0.04,通过log打印输出显示四字节:
四字节数据 0x0A,0xD7,0x23,0xBB转换浮点数显示为:
四字节数据 0x0A,0xD7,0x23,0x3D转换浮点数显示为:
4.整体代码
#include <math.h>
typedef unsigned char byte;
float b2f(byte m0, byte m1, byte m2, byte m3)
{
// 求符号位
float sig = 1.;
if (m0 >=128.)
sig = -1.;
//求阶码
float jie = 0.;
if (m0 >=128.)
{
jie = m0-128. ;
}
else
{
jie = m0;
}
jie = jie * 2.;
if (m1 >=128.)
jie += 1.;
jie -= 127.;
//求尾码
float tail = 0.;
if (m1 >=128.)
m1 -= 128.;
tail = m3 + (m2 + m1 * 256.) * 256.;
tail = (tail)/8388608; // 8388608 = 2^23
float f = sig * pow(2., jie) * (1+tail);
return f;
}
void FloatToByte(float floatNum,unsigned char* byteArry)
{
char* pchar=(char*)&floatNum;
for(int i=0;i<4;i++)
{
*byteArry=*pchar;
pchar++;
byteArry++;
}
}
int main(void)
{
log_init();
while(1)
{
float c=0.04;
unsigned char bcd[4]={0x0A, 0xD7, 0x23, 0x3D};
FloatToByte(c,bcd);
NRF_LOG_INFO("%x %x %x %x\r\n",bcd[0],bcd[1],bcd[2],bcd[3]);
float q=b2f(0xBB, 0x23, 0xD7, 0x0A);//反向
NRF_LOG_INFO("float NUM1 is :"NRF_LOG_FLOAT_MARKER"\r\n",NRF_LOG_FLOAT(q));
q=b2f(0x3D, 0x23, 0xD7, 0x0A);//反向
NRF_LOG_INFO("float NUM2 is :"NRF_LOG_FLOAT_MARKER"\r\n",NRF_LOG_FLOAT(q));
nrf_delay_ms(1000);
}
return 0;
}