【数据采集】将16进制字符串转化为Double类型输出(依照IEEE754标准)
2011-08-30 11:04
513 查看
因为需要读取二进制文件中包含的数据,故需要这样一个转化过程。
鄙人功力太浅,主要参照/article/5766379.html,略有改动,以保证编译运行通过。
鄙人功力太浅,主要参照/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; }
相关文章推荐
- IEEE 16进制字符串转化为double类型
- Java 数据类型转换——byte[]/16进制/字符串互转
- JAVA String与double int 等primitive主数据类型 互相转化
- delphi中如何将string类型的字符串数据转化成byte[]字节数组类型的数据
- Afx全局函数 数据类型 字符串转化函数
- VC Afx全局函数 数据类型 字符串转化函数
- Afx全局函数 数据类型 字符串转化函数
- Android中将List<Map<String, Object>>类型数据与字符串的相互转化
- python基本数据类型(三)-字符串拼接-格式化输出-深浅复制-python3笔记
- 字节类型的数据转换为16进制的字符串
- struts数据类型转化(Double.parseDouble())(values[0].split)(string centerValues[])(properties)
- 处理double类型数据,并转换为百分比的字符串
- 字符串和基本数据类型之间的相互转化
- 在java中,怎样使double类型的数据输出时只保留两位小数?
- Java中输入——输出——数据类型转化…
- 将16进制字符串转化成内存二进制数据
- java字符串之基本数据类型与字符串的转化
- java 二进制数据与16进制字符串相互转化
- 整型数据与字符串类型相互转化的一种实现方法
- 字节数组转化为16进制字符串输出