【数据采集】将16进制字符串转化为Double类型输出(依照IEEE754标准)
因为需要读取二进制文件中包含的数据,故需要这样一个转化过程。
鄙人功力太浅,主要参照http://www.cnblogs.com/xinjun/archive/2010/07/28/1787297.html,略有改动,以保证编译运行通过。
1 #include <iostream> 2 #include <bitset> 3 #include <cmath> 4 #include <stdio.h> 5 #include <string> 6 7 usingnamespace std; 8 9 string charToBin(char temp);//十六进制转二进制串 10 int stringToDouble(string temp);//二进制串到double(整数)--求阶码 11 double BenToDex(string temp);//二进制串到double(小数) 12 double HexToDouble(string temp);//十六进制字符串到double类型 13 14 int main() 15 { 16 double a=HexToDouble("40AD5807C0000000"); 17 cout<<a; 18 cin.get(); 19 20 return0; 21 } 22 23 double HexToDouble(string temp) 24 { 25 string S_Bin="";//转化后的二进制字符串 26 for (int i=0;i<temp.length();i++) 27 { 28 char temp1=temp.at(i); 29 S_Bin=S_Bin+charToBin(temp1); 30 } 31 32 int sign=0;//符号位(1位) 33 if (S_Bin.at(0)=='1') 34 { 35 sign=1; 36 } 37 38 string exponent="";//获取阶码字符串(11位) 39 for (int i=1;i<12;i++) 40 { 41 if (S_Bin.at(i)=='1') 42 exponent=exponent+'1'; 43 else 44 exponent=exponent+'0'; 45 } 46 47 int exponent_double=0;//阶码 48 exponent_double=stringToDouble(exponent); 49 exponent_double=exponent_double-1023;//减去偏移值 50 51 52 string mantissa_temp="";//获取尾数字符串(52位) 53 for (int i=12;i<64;i++) 54 { 55 if (S_Bin.at(i)=='1') 56 mantissa_temp=mantissa_temp+'1'; 57 else 58 mantissa_temp=mantissa_temp+'0'; 59 } 60 61 double mantissa=0;//尾数 62 mantissa=BenToDex(mantissa_temp); 63 mantissa=mantissa+1.0; 64 65 //双精度公式: 66 // F=1.M(二进制) 67 // V=(-1)^s*2^(E-1023)*F 68 double res=0; 69 double a,c; 70 a=pow((-1.0),sign); 71 c=pow(2.0,exponent_double); 72 res=a*c*mantissa; 73 74 return res; 75 } 76 77 string charToBin(char temp)//十六进制转二进制串 78 { 79 switch (temp) 80 { 81 case'0': 82 return"0000"; 83 break; 84 case'1': 85 return"0001"; 86 break; 87 case'2': 88 return"0010"; 89 break; 90 case'3': 91 return"0011"; 92 break; 93 case'4': 94 return"0100"; 95 break; 96 case'5': 97 return"0101"; 98 break; 99 case'6':100 return"0110";101 break;102 case'7':103 return"0111";104 break;105 case'8':106 return"1000";107 break;108 case'9':109 return"1001";110 break;111 case'A':112 case'a':113 return"1010";114 break;115 case'B':116 case'b':117 return"1011";118 break;119 case'C': 120 case'c':121 return"1100";122 break;123 case'D':124 case'd':125 return"1101";126 break;127 case'E':128 case'e':129 return"1110";130 break;131 case'F':132 case'f':133 return"1111";134 break;135 default:136 return"WRONG!";137 }138 }139 140 int stringToDouble(string temp)//二进制串到double(整数)141 {142 int res=0;143 for(int i=0;i<temp.length();i++) 144 {145 res=res*2+(temp[i]-'0'); 146 }147 return res;148 }149 150 double BenToDex(string temp)//二进制串到double(小数)151 {152 int m=temp.length();153 double res=0;154 for (int i=0;i<m;i++)155 {156 res=res+(temp[i]-'0')*pow(2.0,-i-1);157 }158 return res;159 }
转载于:https://www.cnblogs.com/pezy/archive/2011/08/30/Hex2Double.html
【数据采集】将16进制字符串转化为Double类型输出(依照IEEE754标准)相关推荐
- 16进制转double dotnet_IEEE 16进制字符串转化为double类型
因项目需要,需要将内存中的64位16进制字符串表示成double.如下: #include #include #include #include #include using namespace st ...
- 16进制字符串转化为10进制数
同学在MSN CDC电话面试(可惜我在被面试的时候全然没有这么具体的问题了:))中的一个题目:将16进制的字符串转化为10进制数字,例如"1A",则对应26.题目很简单,实现起来也 ...
- 使用指针输入一段16进制字符串,将其转化为10进制
举例,输入fff,输出4095 方法1 #include<iostream> #include<iomanip> #include<cstring> using n ...
- python2.7下面字节数组(ByteArray)和16进制字符串(HexString)转化
由于是python2.7 严谨起见,文中不使用字符串的说法,下面只使用str或者unicode的说法 之所以有这个需要,是因为: Hmac-sha1加密在网上计算的结果是HexString,也就是16 ...
- 二进制数据与16进制字符串相互转化方法
二进制数据转化为16进制字符串(中间加的':'还有':'是为了查看下标,也可以自行去掉): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public st ...
- 加解密后字节数组和(16进制)字符串的相互转换问题
前面几篇博客简单归纳了Android中有涉及到的编码和加解密相关的问题,在这里想再补充下加密解密过程中遇到的字节数组和字符串的转换问题.前面博客中包含了转换的代码,由于这个属于所有加解密共性的问题,所 ...
- C++ 整型转16进制字符串或16进制字符串转整型
前言:整数转16进制字符串,网上大部分的资料都是要传入16进制字符串的位数,有点麻烦.本文介绍的方法自动确定返回的字符串的位数,位数为最小偶数.偶数位方便使用时转成字节数组(unsigned char ...
- 16进制字符串转成字节数组、字节数组转16进制字符串、16进制字符串转成2进制字符串、中英文 字符串转16进制、16进制转换成中英文 字符串
因为需要与硬件相互通讯 用到了这些方法 亲测可用 /*** 16进制表示的字符串 转换为字节数组** @param hexString 16进制表示的字符串* @return byte[] 字节数组* ...
- js 16进制字符串 转 ArrayBuffer
16进制字符串 转 ArrayBuffer 的应用场景是给单片机发送指令. 16进制字符串 转 ArrayBuffer 方法一: var hexStr = 'cf 03 00 00 00 00 1e ...
最新文章
- Linux下怎么诊断网站性能异常
- 15 上下篇博客和按月分类
- Hyperledger Fabric(术语表)
- UA OPTI570 量子力学 Quasi-classical states与Displacement Operator
- 【STM32】STM32F4时钟系统
- 登录不上_无法登录远程:出现身份验证错误,要求的函数不受支持
- 【软件工程】软件开发的本质
- Adobe illustrator 设置字体和微调 - 连载 10
- C# XML文件操作类XmlHelper
- NYOJ105 - 九的余数
- 网易游戏开发工程师笔试题
- linux内核装载vfs过程
- 清华姚班和100个“张小龙” | 中国AI天才养成计划
- Android 图片加载框架Glide主流程源码分析
- git 代码行数统计
- 餐巾计划问题 费用流
- java基础—java由来
- java源代码实现判断闰年和平年
- 观点 | ​苏宁传统零售业“数字化转型”经验分享
- 【集大成篇】数据类型( C、C++、Java )对比
热门文章
- 六、操作系统——内存管理的概念(空间的分配与回收、空间的扩充、地址转换、存储保护)
- py2中存储的pickle和py3中pickle无法读取的兼容性问题解决方案
- LeetCode 2044. 统计按位或能得到最大值的子集数目(状态压缩DP)
- LeetCode 第 32 场双周赛(983/2957,前33.2%)
- LeetCode MySQL 1225. 报告系统状态的连续日期(date_sub + over)
- LeetCode 673. 最长递增子序列的个数(DP)
- 超级签名源码_企业签名和超级签名有哪些区别?
- kaggle共享单车数据分析及预测(随机森林)
- 鸿蒙系统怎么换windows,求助~鸿蒙系统windows环境搭建(hpm-cli安装失败)!
- 缺失值处理 - 拉格朗日插值法 - Python代码