四字节与浮点数之间的转换(c语言实现)

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;
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值