C# 如何将十六进制字符串转换为十进制

C# 如何将十六进制字符串转换为十进制,c#,hex,converter,C#,Hex,Converter,当我尝试这个的时候 Decimal m = Decimal.Parse(columns[1], System.Globalization.NumberStyles.AllowHexSpecifier); 我听到一个例外说 浮点数不支持数字样式AllowHexSpecifier 数据类型 和列[1]=4B414D000000011613C btw 我做错了什么?如何修复它?Decimal是浮点类型。试着改用int.Parse。Decimal是浮点型,比如单,双,所以你不能用标准方法解析字符串,比

当我尝试这个的时候

Decimal m = Decimal.Parse(columns[1], System.Globalization.NumberStyles.AllowHexSpecifier);
我听到一个例外说

浮点数不支持数字样式AllowHexSpecifier 数据类型

和列[1]=4B414D000000011613C btw


我做错了什么?如何修复它?

Decimal
是浮点类型。试着改用
int.Parse

Decimal
是浮点型,比如
,所以你不能用标准方法解析字符串,比如

  4B414.D000000011613C3eAF // <- '.' decimal point; 'e' exponent sign  
如果超过UInt64,您可以拆分您的值:

// to simplify the idea, I remove negative values support
String source = "4B414D000000011613C3";

String highPart = source.Remove(source.Length - 16);
String lowPart = source.Substring(source.Length - 16);

Decimal result =
  ulong.Parse(highPart, System.Globalization.NumberStyles.HexNumber);

result = result * ulong.MaxValue + ulong.Parse(lowPart,  System.Globalization.NumberStyles.HexNumber);

您有一个20个字符的字符串,表示十六进制整数,并且希望将其转换为数字格式。20个字符是80位,所以它不适合整数,但适合十进制。十进制是一种128位浮点表示法,尾数为96位。没有内置的转换函数可以做到这一点

我能想到的最好的策略就是这样

  • 将字符串分成3部分,从右侧开始,每次8个字符。字符串将为HI=4、MI=8和LO=8个字符
  • 使用Parse和十六进制说明符将每个子字符串转换为整数
  • 使用十进制系数组合部件:十进制(LO、MI、HI、0,0)

  • 有关详细信息,请参阅。

    这基于msdn示例,其中十六进制值将转换为双精度值。采用相同的数值来改变结果

            `double dnumber = 0;
    
            long number;
            bool result = Int64.TryParse(hexString,
                    NumberStyles.HexNumber, CultureInfo.InvariantCulture,
                    out number);
            dnumber=BitConverter.Int64BitsToDouble(number);
    
            return dnumber;`
    
    为了使用这个,我给出了一个示例工作程序,在控制台应用程序中使用它并检查结果

            `double dnumber = 0;
    
            long number;
            bool result = Int64.TryParse(hexString,
                    NumberStyles.HexNumber, CultureInfo.InvariantCulture,
                    out number);
            dnumber=BitConverter.Int64BitsToDouble(number);
    
            return dnumber;`
    
    `静态void Main(字符串[]参数) { 常量字符串格式化程序=“{0,27:E16}”

    输出将是


    这是错误的。C#中的Decimal是128位的定点类型,与浮点类型完全不同。我错了。Decimal是128位的浮点十进制类型。[没有理由——我一定是想到VB或COM之类的东西。]列是什么类型[1]?字符串?二进制?浮点?如果是FP,则需要强制转换或转换器,而不是解析。这是我从csv文件中获取的字符串。如果我这样做,则我获取的值对于Int64太大或太小。@user3240428:在这种情况下,您可以将值拆分为两个,将它们解析为ulong/long并合并为十进制。请参阅我的编辑
            Console.WriteLine(string.Format(formatter, HexStringToDouble("0")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble("3FF0000000000000")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble("402E000000000000")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble("406FE00000000000")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble("41EFFFFFFFE00000")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble("3F70000000000000")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble("3DF0000000000000")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble("0000000000000001")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble("000000000000FFFF")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble("0000FFFFFFFFFFFF")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble("FFFFFFFFFFFFFFFF")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble("FFF0000000000000")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble("7FF0000000000000")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble("FFEFFFFFFFFFFFFF")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble("7FEFFFFFFFFFFFFF")));
            Console.WriteLine(string.Format(formatter, HexStringToDouble(long.MinValue.ToString())));
            Console.WriteLine(string.Format(formatter, HexStringToDouble(long.MaxValue.ToString())));
    
            Console.ReadKey();
        }
    
        private static double HexStringToDouble(string hexString)
        {
            double dnumber = 0;
    
            long number;
            bool result = Int64.TryParse(hexString,
                    NumberStyles.HexNumber, CultureInfo.InvariantCulture,
                    out number);
            dnumber=BitConverter.Int64BitsToDouble(number);
    
            return dnumber;
        }`