您的位置:首页 > 其它

HexToFloat和HexToDouble

2016-06-26 21:20 531 查看
要明白如何将十六进制转换为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: