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

时间:2014-03-21 12:47:43

标签: c# hex converter

当我尝试这个时,

Decimal m = Decimal.Parse(columns[1], System.Globalization.NumberStyles.AllowHexSpecifier);

我收到一个ArgumentException,说明了这个,

  

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

和列[1] = 4B414D000000011613C3 btw。

我做错了什么以及如何解决?

4 个答案:

答案 0 :(得分:4)

Decimal是浮点类型。请尝试使用int.Parse

答案 1 :(得分:3)

Decimal是浮点类型,例如SingleDouble,因此您无法通过标准方式解析

等字符串
  4B414.D000000011613C3eAF // <- '.' decimal point; 'e' exponent sign  

另一方面,Decimal接近int128而我们没有超长整数。如果您的值不那么大(小于 2 ^ 63 ,大​​约 9.2e18 ),您可以尝试一下

// It's OK in your case:
// 4B414D000000011613C3 (hex) = 5422700088726126870 (dec) < 9223372036854775808 
// use long.Parse() or ulong.Parse(): int is too small
Decimal result = long.Parse(columns[1], System.Globalization.NumberStyles.HexNumber);

如果超过 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);

答案 2 :(得分:2)

您有一个20个字符的字符串,表示十六进制整数,并且您希望将其转换为数字格式。 20个字符是80位,因此它不适合整数,但它将适合十进制。十进制是128位浮点表示,具有96位尾数。没有可以执行此操作的内置转换功能。

我能想到的最佳策略就是这个。

  1. 从右边开始将字符串分成3个部分,每次取8个字符。字符串将是HI = 4,MI = 8和LO = 8个字符。
  2. 使用Parse和十六进制说明符将每个子字符串转换为整数。
  3. 使用Decimal ctor:Decimal(LO,MI,HI,0,0)组合各部分。
  4. 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/bb1c1a6x%28v=vs.110%29.aspx

答案 3 :(得分:0)

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

        `double dnumber = 0;

        long number;
        bool result = Int64.TryParse(hexString,
                NumberStyles.HexNumber, CultureInfo.InvariantCulture,
                out number);
        dnumber=BitConverter.Int64BitsToDouble(number);

        return dnumber;`

要使用此程序,我给出了示例工作程序,请在控制台应用程序中使用它并检查结果。

`static void Main(string [] args)         {             const string formatter =“ {0,27:E16}”;

        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;
    }`

输出将为

enter image description here