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已经进行高低地址转换):
按照转换规则,写出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; }
相关文章推荐
- 移动端布局方案 讲解与实例
- 19PL_SQL过程之创建存储过程
- 前端开发之日期控件、HTML5日期输入类型(date)
- 分页工具类分装
- htML+CSS3-》第4阶段:HTML5之CSS3进阶
- 18PL_SQL过程之可更新的游标
- Node.js Buffer学以致用
- 【测试技术】websocket-client
- bzoj 3932(主席树)
- python中的enumerate函数的用法
- Xlistview上拉加载下拉刷新
- 17PL_SQL过程之带参数的游标
- pdo预定义常量
- java代码注释规范
- 如何在 PHP 中处理 Protocol Buffers 数据
- Android百日程序:Intent传递数据
- 浅谈软件性能测试中关键指标的监控与分析 http://www.ltesting.net/ceshi/ceshijishu/xncs/2014/1030/207641.html
- 虚函数和虚拟继承的内存分布
- SharedPreference的说明
- Volley StringRequest和JSONObjectRequest使用几个细节