C# 将十六进制转换为双进制

C# 将十六进制转换为双进制,c#,C#,如何设置双精度计数器的特定位 对于int,我会这样做: public static int Value { get { return 0xfff8; } } 双人间我该怎么办 public static double Value { get { return 0xfff8; } } 我有点担心我可能会得到从0xfff8的int表示到双浮点表示的隐式转换。但是,无论类型如何,我都希望使用0xfff8位模式。查看位转换器类或go不安全 不安全示例(未测试): 位转换器示例: double d =

如何设置双精度计数器的特定位

对于int,我会这样做:

public static int Value { get { return 0xfff8; } }
双人间我该怎么办

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

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

查看
位转换器
类或go
不安全

不安全示例(未测试):

位转换器示例:

double d = BitConverter.Int64BitsToDouble(0xdeadbeef);


我使用的是.NET 4.0

让我们假设您有以下字符串
0x4007B425F202107B
,它表示双精度值

要将其转换为double(),需要使用以下代码:

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

.

我刚刚研究了将双精度值的十六进制字符串转换回双精度值的主题。 我发现了一些有用的网站。 本网站介绍如何计算双精度值: 这显示了小数点分形是如何计算的(二进制示例)

我的示例输入值是40C688C000000000,结果是11537.5 重要的是前3个十六进制值,因为它们是用于双精度值的指数。这之后的十六进制值的数量实际上并不重要

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

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;
}
public static double DoubleFromHex(字符串十六进制)
{
整数指数;
双重结果;
字符串doubleexponenthex=十六进制子字符串(0,3);
字符串double尾数=十六进制子字符串(3);
双尾数=1;//是的,它就是这样工作的
对于(int i=0;i
var hex = "0x4007B425F202107B";
var int64Val = Convert.ToInt64(hex, 16);
var doubleVal = BitConverter.Int64BitsToDouble(int64Val);
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;
}