IEEE 16进制字符串转化为double类型

因项目需要,需要将内存中的64位16进制字符串表示成double。如下:

#include <iostream>
#include <bitset>
#include <cmath>
#include <stdio.h>
#include <string>
using namespace std;

string charToBin(char temp);//十六进制转二进制串
int stringToDouble(string temp);//二进制串到double(整数)--求阶码
double BenToDex(string temp);//二进制串到double(小数)
double HexToDouble(string temp);//十六进制字符串到double类型

int main()
{

	double a=HexToDouble("40e2c1cccccccccd");
	cout<<a;

	return 0;
}
double HexToDouble(string temp)
{
	string S_Bin="";//转化后的二进制字符串
	for (int i=0;i<temp.length();i++)
	{
		char temp1=temp.at(i);
		S_Bin=S_Bin+charToBin(temp1);
	}


	int sign=0;//符号位	
	if (S_Bin.at(0)=='1')
	{
		sign=1;
	}

	string exponent="";
	for (i=1;i<12;i++)
	{
		if (S_Bin.at(i)=='1')
		{
			exponent=exponent+'1';
		}
		else
			exponent=exponent+'0';
	}
	
	int exponent_double=0;//阶码
	exponent_double=stringToDouble(exponent);
	exponent_double=exponent_double-1023;

	
	string mantissa_temp="";
	for (i=12;i<64;i++)
	{
		if (S_Bin.at(i)=='1')
		{
			mantissa_temp=mantissa_temp+'1';
		}
		else
			mantissa_temp=mantissa_temp+'0';
	}
	double mantissa=0;
	mantissa=BenToDex(mantissa_temp);
	mantissa=mantissa+1.0;

	
	double res=0;
	double a,c;
	a=pow((-1),sign);
	c=pow(2,exponent_double);
	res=a*mantissa*c;


	return res;
}
string charToBin(char temp)//十六进制转二进制串
{ 
	switch (temp)
	{
	case '0':
		return "0000";
		break;
	case '1':
		return "0001";
		break;
	case '2':
		return "0010";
		break;
	case '3':
		return "0011";
		break;
	case '4':
		return "0100";
		break;
	case '5':
		return "0101";
		break;
	case '6':
		return "0110";
		break;
	case '7':
		return "0111";
		break;
	case '8':
		return "1000";
		break;
	case '9':
		return "1001";
		break;
	case 'A':
     case 'a':
		return "1010";
		break;
	case 'B':
     case 'b':
		return "1011";
		break;
	case 'C':
             case 'c':
		return "1100";
		break;
	case 'D':
      case 'd':
		return "1101";
		break;
	case 'E':
             case 'e':
		return "1110";
		break;
	case 'F':
             case 'f':
		return "1111";
		break;
	default:
		return "WRONG!";
	}
}
int stringToDouble(string temp)//二进制串到double(整数)
{
	double res=0;
	for   (int i=0;i<temp.length();i++) 
	{
        res=res*2+(temp[i]-'0');   
	}
	return res;
}
double BenToDex(string temp)//二进制串到double(小数)
{
	int m=temp.length();
	double res=0;
	for (int i=0;i<m;i++)
	{
		res=res+(temp[i]-'0')*pow(2,-i-1);
	}
	return res;
}
posted @ 2010-07-28 20:03  xinjun  阅读(4313)  评论(1编辑  收藏  举报