(三十)C++篇-float转byte

float型在线转换工具--在线进制转换.
之前看了一篇文章,上面写浮点数值搭配通讯…自动化工程师难跨越的门槛,既然这个门槛不容易越,我们不妨越一下,以下总结三种方法(联合体,指针,位运算):

  1. 联合体方法,自动转换
struct data
{
    union
    {
        float float_value;
        unsigned char byte_value[4];
    };
}float_data;
  1. 指针方法(1)--指针地址自增
bool float_to_byte_2(float float_value,unsigned char byte[])
{   
    unsigned char* pdata = (unsigned char*)&float_value;  
    for(int i=0;i<4;i++)  
    {  
        byte[i] = *pdata++;//指针地址自增     
    }  
    return true;
}
  1. 指针方法(2)--指针地址索引
bool float_to_byte_3(float float_value,unsigned char byte[])
{   
    unsigned char* pdata = (unsigned char *)&float_value;
    for(int i=0;i<4;i++)  
    {  
        byte[i] = *(pdata+i); //指针地址索引
    }  
    return true;
}
  1. 传统的float数值与位变换
bool float_to_byte_4(float float_value,unsigned char byte[])
{   
    bool convert_bit[32];
    float plus_float = float_value;
    float temp_float;
    
    ......

    return true;
}

以下是代码的测试实例,其中有好玩的16进制输出格式“printf”和“cout”,按照自己喜欢的格式输出结果即可。

测试代码:

#include 
#include 
#include 
#include 
#include

using namespace std;

//Method 1 联合体方法,自动转换
struct data
{
    union
    {
        float float_value;
        unsigned char byte_value[4];
    };
}float_data;


//Method 2 float型数据与字节数组的转化
bool float_to_byte_2(float float_value,unsigned char byte[])
{   
    unsigned char* pdata = (unsigned char*)&float_value;  
    for(int i=0;i<4;i++)  
    {  
        byte[i] = *pdata++;//指针地址自增     
    }  
    return true;
}

//Method 3 float型数据与字节数组的转化
bool float_to_byte_3(float float_value,unsigned char byte[])
{   
    unsigned char* pdata = (unsigned char *)&float_value;
    for(int i=0;i<4;i++)  
    {  
        byte[i] = *(pdata+i); //指针地址索引
    }  
    return true;
}

//Method 4 传统的float数值与位变换
bool float_to_byte_4(float float_value,unsigned char byte[])
{   
    bool convert_bit[32];
    float plus_float = float_value;
    float temp_float;
    
    int e = 127;
    int a = 0;
    //1,sign
    (float_value>=0)?convert_bit[31] = 0 : convert_bit[31] = 1;
    (float_value>=0)?plus_float = float_value : plus_float=-float_value;

    if(float_value == 0)
    {
        byte[0] = 0;
        byte[1] = 0;
        byte[2] = 0;
        byte[3] = 0;
        return true;
    }   
    
    temp_float = plus_float;
    while(temp_float >= 2)
    {
        temp_float = temp_float/2.0;
        a = a + 1;
    }
    temp_float = plus_float;

    while(temp_float < 1)
    {
        temp_float = temp_float*2.0;
        a = a - 1;
    }
    e = e + a;
    for(int i = 0;i<8;i++)
    {
        int t = 23 + i;
        convert_bit[t] = (e>>i)&0x01;
    }
    
    //3,fraction

    temp_float = plus_float * pow(2,-a);
    temp_float = temp_float - 1;
    for(int i = 22;i>=0;i--)
    {
        temp_float = temp_float *2;
        if(temp_float >= 1)
        {
            temp_float = temp_float -1;
            convert_bit[i] = 1;
        }
        else
        {
            convert_bit[i] = 0;
        }
    }
    
    for(int i = 0;i<8;i++)
    {
        byte[0] += convert_bit[i]<

输出结果:

float:1.234
Method 1:
byte0:182  byte1:243  byte2:157  byte3:63  
byte0:b6  byte1:f3  byte2:9d  byte3:3f  
byte0:b6  byte1:f3  byte2:9d  byte3:3f  
Method 2:
byte0:b6  byte1:f3  byte2:9d  byte3:3f  
Method 3:
byte0:b6  byte1:f3  byte2:9d  byte3:3f  
Method 4:
byte0:b6  byte1:f3  byte2:9d  byte3:3f 

你可能感兴趣的:((三十)C++篇-float转byte)