簡體   English   中英

如何將十六進制字符串轉換為十進制

[英]How to convert Hex string to Decimal

當我嘗試這個

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

我得到一個ArgumentException這樣說,

浮點數據類型不支持數字樣式AllowHexSpecifier。

和column [1] = 4B414D000000011613C3 btw。

我在做什么錯以及如何解決?

Decimal是浮點類型。 嘗試改用int.Parse

Decimal是浮點類型,例如SingleDouble ,因此您不能通過標准方式解析字符串,例如

  4B414.D000000011613C3eAF // <- '.' decimal point; 'e' exponent sign  

另一方面, Decimal接近int128而我們沒有那么長的int 如果您的值不是那么大 (小於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);

您有一個代表十六進制整數的20字符串,並且想要將其轉換為數字格式。 20個字符為80位,因此它不能容納整數,但可以容納十進制。 十進制是具有96位尾數的128位浮點表示形式。 沒有內置的轉換功能可以做到這一點。

我能想到的最佳策略就是這個。

  1. 從右開始將字符串分成3個部分,每次取8個字符。 字符串將為HI = 4,MI = 8和LO = 8個字符。
  2. 使用Parse和十六進制說明符將每個子字符串轉換為整數。
  3. 使用十進制ctor組合零件:Decimal(LO,MI,HI,0,0)。

有關詳細信息,請參見http://msdn.microsoft.com/zh-cn/library/bb1c1a6x%28v=vs.110%29.aspx

這基於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;
    }`

輸出將是

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM