您的位置:首页 > 其它

【数据采集】将16进制字符串转化为Double类型输出(依照IEEE754标准)

2011-08-30 11:04 513 查看
因为需要读取二进制文件中包含的数据,故需要这样一个转化过程。

鄙人功力太浅,主要参照/article/5766379.html,略有改动,以保证编译运行通过。

#include <iostream>
#include <bitset>
#include <cmath>
#include <stdio.h>
#include <string>

usingnamespace 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("40AD5807C0000000");
cout<<a;
cin.get();

return0;
}

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;//符号位(1位)
if (S_Bin.at(0)=='1')
{
sign=1;
}

string exponent="";//获取阶码字符串(11位)
for (int 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="";//获取尾数字符串(52位)
for (int 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;

//双精度公式:
// F=1.M(二进制)
// V=(-1)^s*2^(E-1023)*F
double res=0;
double a,c;
a=pow((-1.0),sign);
c=pow(2.0,exponent_double);
res=a*c*mantissa;

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(整数)
{
int 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.0,-i-1);
}
return res;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: