HexToFloat和HexToDouble

要明白如何將十六進制轉換爲float或double,需要了解浮點數的二進制存儲和轉換方式。float和double在存儲方式上都遵從IEEE的規範,且float遵從IEEE R32.24,而double遵從R64.53。具體轉換規則可以參考http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html

按照轉換規則,寫出HexToFloat和HexToDouble代碼如下(buf指向的Hex已經進行高低地址轉換):

//將字節中pos位置開始的len位的二進制數轉換爲整數
unsigned int getbitu(const unsigned char *buff, int pos, int len)
{
    unsigned int bits=0;
    int i;
    for (i=pos;i<pos+len;i++)
    {
        bits=(bits<<1)+((buff[i/8]>>(7-i%8))&1u);   //從高位到低位逐位計算
    }
    return bits;
}

float HexToFloat(const unsigned char *buf)
{
    float value = 0.0;
    unsigned int i = 0;
    unsigned int num, temp;
    int num2;
    bool flags1 = true;

    num = getbitu(buf, i, 1); //標誌位
    i = i + 1;
//指數部分,float型數據其規定偏移量爲127,階碼有正有負,對於8位二進制,則其表示範圍爲-128-127
    num2 = getbitu(buf, i, 8) - 127;
    i = i + 8;

    while(1)
    {
        if(flags1)
        {
            value += 1 * pow(2, num2);
            num2--;
            flags1 = false;
        }
        temp = getbitu(buf, i, 1);
        i += 1;
        value += temp * pow(2, num2);
        num2--;

        if(i == 32)
            break;
    }

    if(num == 1)
        value *= -1;

    return value;
}

double HexToDouble(const unsigned char* buf)
{
    double value = 0;
    unsigned int i = 0;
    unsigned int num,temp;
    int num2;
    bool flags1 = true;

    num = getbitu(buf,i,1); //標誌位               
    i += 1;
//double型規定偏移量爲1023,其表示範圍爲-1024-1023
    num2 = getbitu(buf,i,11) - 1023;        
    i += 11;    

    while(1)
    {
        if(flags1)
        {
            flags1 = false;
            value += 1 * pow(2,num2); num2--;
        }
        temp = getbitu(buf,i,1);    i += 1;
        value += temp * pow(2,num2); num2--;
        if(i == 64)
            break;
    }
    if(num == 1)
        value *= -1;

    return value;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章