• ## 十六进制转double

千次阅读 2018-07-11 14:56:29
要明白如何将十六进制转换为float或double，需要了解浮点数的二进制存储和转换方式。float和double在存储方式上都遵从IEEE的规范，且float遵从IEEE R32.24，而double遵从R64.53。具体转换规则可以参考...
要明白如何将十六进制转换为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已经进行高低地址转换）：//将字节中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;
}


展开全文
• how do you set specific bits for a double?For an int I'd do something like this:public static int Value { get { return 0xfff8; } }What should I do for double?public static double Value { get { return ...
how do you set specific bits for a double?For an int I'd do something like this:public static int Value { get { return 0xfff8; } }What should I do for double?public static double Value { get { return 0xfff8; } }I'm a bit concerned that I may get an implicit conversion from an int representation of 0xfff8 to the double floating point representation.  However, I really want that 0xfff8 bit pattern regardless of the type.解决方案Look at the BitConverter class or go unsafe.Unsafe example (untested):public unsafe double FromLong(long x){return *((double*)&x);}BitConverter example:double d = BitConverter.Int64BitsToDouble(0xdeadbeef);
展开全文
• 十六进制转十进制，十进制转十六进制，十六进制转float，十六进制转double
• /*** 数据类型转换工具类*@authorcyf**/public classNumConvertUtil{/*** bytes 16进制字符串*@parambArray*@return*/public static final String bytesToHexString(byte[] bArray) {StringBuffer sb= ...
/*** 数据类型转换工具类*@authorcyf**/public classNumConvertUtil{/*** bytes 转16进制字符串*@parambArray*@return*/public static final String bytesToHexString(byte[] bArray) {StringBuffer sb= newStringBuffer(bArray.length);String sTemp;for (int i = 0; i < bArray.length; i++) {sTemp= Integer.toHexString(0xFF &bArray[i]);if (sTemp.length() < 2)sb.append(0);sb.append(sTemp.toUpperCase());}returnsb.toString();}/*** 16进制字符串转bytes*@paramhex*@return*/public static byte[] hexStringToByte(String hex) {int len = 0;int num=0;//判断字符串的长度是否是两位if(hex.length()>=2){//判断字符喜欢是否是偶数len=(hex.length() / 2);num= (hex.length() % 2);if (num == 1) {hex= "0" +hex;len=len+1;}}else{hex= "0" +hex;len=1;}byte[] result = new byte[len];char[] achar =hex.toCharArray();for (int i = 0; i < len; i++) {int pos = i * 2;result[i]= (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));}returnresult;}private static int toByte(charc) {if (c >= 'a')return (c - 'a' + 10) & 0x0f;if (c >= 'A')return (c - 'A' + 10) & 0x0f;return (c - '0') & 0x0f;}/*** 16进制字符串转十进制int*@paramHexString*@return*/public static intHexStringToInt(String HexString) {int inJTFingerLockAddress = Integer.valueOf(HexString, 16);returninJTFingerLockAddress;}/*** 十进制int转16进制字符串*@paramHexString*@return*/public static String IntToHexString(intnum) {String hexString=Integer.toHexString(num);returnhexString;}/*** 16进制String转BCD*@paramasc*@return*/public static byte[] strToBcd(String asc) {int len =asc.length();int mod = len % 2;if (mod != 0) {asc= "0" +asc;len=asc.length();}byte abt[] = new byte[len];if (len >= 2) {len= len / 2;}byte bbt[] = new byte[len];abt=asc.getBytes();intj, k;for (int p = 0; p < asc.length()/2; p++) {if ( (abt[2 * p] >= '0') && (abt[2 * p] <= '9')) {j= abt[2 * p] - '0';}else if ( (abt[2 * p] >= 'a') && (abt[2 * p] <= 'z')) {j= abt[2 * p] - 'a' + 0x0a;}else{j= abt[2 * p] - 'A' + 0x0a;}if ( (abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9')) {k= abt[2 * p + 1] - '0';}else if ( (abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z')) {k= abt[2 * p + 1] - 'a' + 0x0a;}else{k= abt[2 * p + 1] - 'A' + 0x0a;}int a = (j << 4) +k;byte b = (byte) a;bbt[p]=b;}returnbbt;}/*** String 类型数字转化为Double  保留置顶小数位(用于显示金额等。)*@parammoney*@paramtype  保留小数点位数  #.00保留两位  #.0保留一位  #保留整数*@return*/public staticString strToDouble(String money,String type){String toDouble= newDecimalFormat(type).format(Double.parseDouble(money));returntoDouble;}}
展开全文
• /*** 数据类型转换工具类*@authorcyf**/public classNumConvertUtil{/*** bytes 16进制字符串*@parambArray*@return*/public static final String bytesToHexString(byte[] bArray) {StringBuffer sb= ...
/*** 数据类型转换工具类*@authorcyf**/public classNumConvertUtil{/*** bytes 转16进制字符串*@parambArray*@return*/public static final String bytesToHexString(byte[] bArray) {StringBuffer sb= newStringBuffer(bArray.length);String sTemp;for (int i = 0; i < bArray.length; i++) {sTemp= Integer.toHexString(0xFF &bArray[i]);if (sTemp.length() < 2)sb.append(0);sb.append(sTemp.toUpperCase());}returnsb.toString();}/*** 16进制字符串转bytes*@paramhex*@return*/public static byte[] hexStringToByte(String hex) {int len = 0;int num=0;//判断字符串的长度是否是两位if(hex.length()>=2){//判断字符喜欢是否是偶数len=(hex.length() / 2);num= (hex.length() % 2);if (num == 1) {hex= "0" +hex;len=len+1;}}else{hex= "0" +hex;len=1;}byte[] result = new byte[len];char[] achar =hex.toCharArray();for (int i = 0; i < len; i++) {int pos = i * 2;result[i]= (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));}returnresult;}private static int toByte(charc) {if (c >= 'a')return (c - 'a' + 10) & 0x0f;if (c >= 'A')return (c - 'A' + 10) & 0x0f;return (c - '0') & 0x0f;}/*** 16进制字符串转十进制int*@paramHexString*@return*/public static intHexStringToInt(String HexString) {int inJTFingerLockAddress = Integer.valueOf(HexString, 16);returninJTFingerLockAddress;}/*** 十进制int转16进制字符串*@paramHexString*@return*/public static String IntToHexString(intnum) {String hexString=Integer.toHexString(num);returnhexString;}/*** 16进制String转BCD*@paramasc*@return*/public static byte[] strToBcd(String asc) {int len =asc.length();int mod = len % 2;if (mod != 0) {asc= "0" +asc;len=asc.length();}byte abt[] = new byte[len];if (len >= 2) {len= len / 2;}byte bbt[] = new byte[len];abt=asc.getBytes();intj, k;for (int p = 0; p < asc.length()/2; p++) {if ( (abt[2 * p] >= '0') && (abt[2 * p] <= '9')) {j= abt[2 * p] - '0';}else if ( (abt[2 * p] >= 'a') && (abt[2 * p] <= 'z')) {j= abt[2 * p] - 'a' + 0x0a;}else{j= abt[2 * p] - 'A' + 0x0a;}if ( (abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9')) {k= abt[2 * p + 1] - '0';}else if ( (abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z')) {k= abt[2 * p + 1] - 'a' + 0x0a;}else{k= abt[2 * p + 1] - 'A' + 0x0a;}int a = (j << 4) +k;byte b = (byte) a;bbt[p]=b;}returnbbt;}/*** String 类型数字转化为Double  保留置顶小数位(用于显示金额等。)*@parammoney*@paramtype  保留小数点位数  #.00保留两位  #.0保留一位  #保留整数*@return*/public staticString strToDouble(String money,String type){String toDouble= newDecimalFormat(type).format(Double.parseDouble(money));returntoDouble;}}
展开全文
• /*** 十六进制转正负数*(2个字节的)*/public static double parseHex4(String num) {if (num.length() != 4) {throw new NumberFormatException(“Wrong length: ” + num.length() + “, must be 4.”);}int ret = ...
• 　从键盘输入一个不超过8位的正的十六进制数字符串，将它转换为正的十进制数后输出。 　注：十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 样例输入 FFFF 样例输出 65535 思路：首先Java虽然有...
• 基础练习 十六进制转十进制 问题描述 　从键盘输入一个不超过8位的正的十六进制数字符串，将它转换为正的十进制数后输出。 　注：十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 样例输入 FFFF ...
• 从键盘输入一个不超过8位的正的十六进制数字符串，将它转换为正的十进制数后输出。 　注：十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 样例输入 FFFF 样例输出 65535 代码 import java.util....
• 　从键盘输入一个不超过8位的正的十六进制数字符串，将它转换为正的十进制数后输出。 　注：十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 样例输入 FFFF 样例输出 65535 1. #include 2. #...
• /** * 十六进制转正负数 *(2个字节的) */ public static double parseHex4(String num) { if (num.length() != 4) { throw new NumberFormatException("Wrong length: " + num.length(...
• /** * 数据类型转换工具类 * @author cyf ... * bytes 16进制字符串 * @param bArray * @return */ public static final String bytesToHexString(byte[] bArray) { StringBuffer sb = new String...
•  * 十六进制转正负数  * (2个字节的)  */  public static double parseHex4(String num) {  if (num.length() != 4) {  throw new NumberFormatException("Wrong length: " + num.length(...
• /** * 数据类型转换工具类 * @author cyf * */ public class NumConvertUtil{ ... * bytes 16进制字符串 * @param bArray * @return */ public static final String by...
• 开始做进制转换的时候，将string 转换为double 再将double转换为 float，然后发现十六进制中的字母转换为double是不成功的，失败的，所以进行小小探索。  string hexString = "3d8f5c29";  uint num =...
• 问题描述 　从键盘输入一个不超过...如果将最后的结果使用整数类型保存，会出现在十六进制数较大时超出int范围的情况，故而将结果m定义为double类型，在输出时不输出小数点后内容即可 #include&amp;amp;lt;cstdi...
• 考虑到举一反三,这里顺便上完整代码,顺便可以考虑实现R进制和十进制的转换. 完整代码: 1 #include <stdio.h> 2 #include <math.h> 3 4 double 5 hexToDecimal(int); 6 7 double 8 ...
• #include #include #include int main(void) {  char a[9];  int i,len,z=0,k=0;  double s=0,x;  gets(a);  len = strlen(a);  for (i=len-1;i>=0;i--)
• Public Function decToHex(ByVal decNumber As Double, ByVal reservedDigits As Integer) As String '将十进制转换为十六进制字符串，保留需要的位 Dim hexStr = Hex(decNumber) If hexStr.Length < ...
• length() == 1)  {  hex = '0' + hex;  }  ret += hex.toUpperCase();... double d = Double.parseDouble(s);...　double Double.valueof(String s).doublevalue()  二 stri
• www.blogjava.net/freeman1984/archive/2010/02/02/311663.html
• 今日,小弟我做题目遇到了Double型转换成十六进制的问题,到网上找了很多方法,结果都是手动的,最后,我一狠心,自己做了一个实验,代码如下:import java.io.*;public class HexChange{public static void main(String ...
• //需引用Math单元，Decjg 需定义成全局变量function TFrm_Main.HextoDec(s:string):Double;var strlen:integer; Lstr,Rstr:string; partf:Extended;begin strlen:=Length(s) div 2; if Length(s)>0 then b
• // 输入十进制整数，输出同样内存排布的float表示 inline float i2f(int i) { float f = 0; assert(sizeof(int) == sizeof(float)); memcpy(&f, &i, 4); return f; } inline double ll2d(long long
• 因项目需要，需要将内存中的64位16进制字符串表示成double。如下：#include #include #include #include #include ...//十六进制转二进制串int stringToDouble(string temp);//二进制串到double(整数)--求阶码double...
• C语言：十六进制(HEX)和浮点类型(float、double)转换

...