将Hex转换为Double

时间:2011-09-01 15:55:51

标签: c#

如何设置双精度的特定位?

对于int我会做这样的事情:

public static int Value { get { return 0xfff8; } }

我该怎么办?

public static double Value { get { return 0xfff8; } }

我有点担心我可能会从0xfff8的int表示到双浮点表示的隐式转换。但是,我真的希望0xfff8位模式无论类型。

4 个答案:

答案 0 :(得分:6)

查看BitConverter课程或转到unsafe

不安全的例子(未经测试):

public unsafe double FromLong(long x)
{
  return *((double*)&x);
}

BitConverter示例:

double d = BitConverter.Int64BitsToDouble(0xdeadbeef);

http://msdn2.microsoft.com/en-us/library/system.bitconverter.int64bitstodouble

答案 1 :(得分:2)

byte bTemp = Convert.ToByte(hexValueInString, 16);
double doubleTemp = Convert.ToDouble(bTemp);

我正在使用.NET 4.0

答案 2 :(得分:1)

假设您有以下字符串0x4007B425F202107B,它代表双值。

要将其转换为double(IEEE754 Double precision 64-bit),您需要使用以下代码:

var hex = "0x4007B425F202107B";
var int64Val = Convert.ToInt64(hex, 16);
var doubleVal = BitConverter.Int64BitsToDouble(int64Val);

Online converter from hex to double

答案 3 :(得分:0)

我刚刚研究了将Double Value的Hex字符串转换为Double Value的主题。 我发现了一些有用的网站。 本网站显示了如何计算双值:https://gregstoll.dyndns.org/~gregstoll/floattohex/ 这显示了如何计算小数点分形(二进制例子)https://www.geeksforgeeks.org/convert-binary-fraction-decimal/

我的示例输入值是40C688C000000000,结果是11537.5 重要的是前3个十六进制值,因为它们是用于Double Value的指数。在此之后,Hex值的数量并不重要。

这是我根据此信息创建的简单代码:

public static double DoubleFromHex(string hex)
{
    int exponent;
    double result;
    string doubleexponenthex = hex.Substring(0, 3);
    string doublemantissahex = hex.Substring(3);
    double mantissavalue = 1; //yes this is how it works

    for (int i = 0; i < doublemantissahex.Length; i++)
    {
        int hexsignvalue = Convert.ToInt32(doublemantissahex.Substring(i, 1),16); //Convert ,16 Converts from Hex
        mantissavalue += hexsignvalue * (1 / Math.Pow(16, i+1));
    }

    exponent = Convert.ToInt32(doubleexponenthex, 16);
    exponent = exponent - 1023;  //just how it works

    result = Math.Pow(2, exponent) * mantissavalue;
    return result;
}