How to convert numbers between hexadecimal and decimal

前端 未结 17 1077
情歌与酒
情歌与酒 2020-11-22 05:30

How do you convert between hexadecimal numbers and decimal numbers in C#?

相关标签:
17条回答
  • 2020-11-22 05:53

    If you want maximum performance when doing conversion from hex to decimal number, you can use the approach with pre-populated table of hex-to-decimal values.

    Here is the code that illustrates that idea. My performance tests showed that it can be 20%-40% faster than Convert.ToInt32(...):

    class TableConvert
      {
          static sbyte[] unhex_table =
          { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
           ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
           ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
           , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1
           ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
           ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
           ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
           ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
          };
    
          public static int Convert(string hexNumber)
          {
              int decValue = unhex_table[(byte)hexNumber[0]];
              for (int i = 1; i < hexNumber.Length; i++)
              {
                  decValue *= 16;
                  decValue += unhex_table[(byte)hexNumber[i]];
              }
              return decValue;
          }
      }
    
    0 讨论(0)
  • 2020-11-22 05:53

    Hex to Decimal Conversion

    Convert.ToInt32(number, 16);
    

    Decimal to Hex Conversion

    int.Parse(number, System.Globalization.NumberStyles.HexNumber)
    

    For more details Check this article

    0 讨论(0)
  • 2020-11-22 05:55
    class HexToDecimal
    {
        static void Main()
        {
            while (true)
            {
                Console.Write("Enter digit number to convert: ");
                int n = int.Parse(Console.ReadLine()); // set hexadecimal digit number  
                Console.Write("Enter hexadecimal number: ");
                string str = Console.ReadLine();
                str.Reverse();
    
                char[] ch = str.ToCharArray();
                int[] intarray = new int[n];
    
                decimal decimalval = 0;
    
                for (int i = ch.Length - 1; i >= 0; i--)
                {
                    if (ch[i] == '0')
                        intarray[i] = 0;
                    if (ch[i] == '1')
                        intarray[i] = 1;
                    if (ch[i] == '2')
                        intarray[i] = 2;
                    if (ch[i] == '3')
                        intarray[i] = 3;
                    if (ch[i] == '4')
                        intarray[i] = 4;
                    if (ch[i] == '5')
                        intarray[i] = 5;
                    if (ch[i] == '6')
                        intarray[i] = 6;
                    if (ch[i] == '7')
                        intarray[i] = 7;
                    if (ch[i] == '8')
                        intarray[i] = 8;
                    if (ch[i] == '9')
                        intarray[i] = 9;
                    if (ch[i] == 'A')
                        intarray[i] = 10;
                    if (ch[i] == 'B')
                        intarray[i] = 11;
                    if (ch[i] == 'C')
                        intarray[i] = 12;
                    if (ch[i] == 'D')
                        intarray[i] = 13;
                    if (ch[i] == 'E')
                        intarray[i] = 14;
                    if (ch[i] == 'F')
                        intarray[i] = 15;
    
                    decimalval += intarray[i] * (decimal)Math.Pow(16, ch.Length - 1 - i);
    
                }
    
                Console.WriteLine(decimalval);
            }
    
        }
    
    }
    
    0 讨论(0)
  • 2020-11-22 05:56

    Here is my function:

    using System;
    using System.Collections.Generic;
    class HexadecimalToDecimal
    {
        static Dictionary<char, int> hexdecval = new Dictionary<char, int>{
            {'0', 0},
            {'1', 1},
            {'2', 2},
            {'3', 3},
            {'4', 4},
            {'5', 5},
            {'6', 6},
            {'7', 7},
            {'8', 8},
            {'9', 9},
            {'a', 10},
            {'b', 11},
            {'c', 12},
            {'d', 13},
            {'e', 14},
            {'f', 15},
        };
    
        static decimal HexToDec(string hex)
        {
            decimal result = 0;
            hex = hex.ToLower();
    
            for (int i = 0; i < hex.Length; i++)
            {
                char valAt = hex[hex.Length - 1 - i];
                result += hexdecval[valAt] * (int)Math.Pow(16, i);
            }
    
            return result;
        }
    
        static void Main()
        {
    
            Console.WriteLine("Enter Hexadecimal value");
            string hex = Console.ReadLine().Trim();
    
            //string hex = "29A";
            Console.WriteLine("Hex {0} is dec {1}", hex, HexToDec(hex));
    
            Console.ReadKey();
        }
    }
    
    0 讨论(0)
  • 2020-11-22 06:02

    My version is I think a little more understandable because my C# knowledge is not so high. I'm using this algorithm: http://easyguyevo.hubpages.com/hub/Convert-Hex-to-Decimal (The Example 2)

    using System;
    using System.Collections.Generic;
    
    static class Tool
    {
        public static string DecToHex(int x)
        {
            string result = "";
    
            while (x != 0)
            {
                if ((x % 16) < 10)
                    result = x % 16 + result;
                else
                {
                    string temp = "";
    
                    switch (x % 16)
                    {
                        case 10: temp = "A"; break;
                        case 11: temp = "B"; break;
                        case 12: temp = "C"; break;
                        case 13: temp = "D"; break;
                        case 14: temp = "E"; break;
                        case 15: temp = "F"; break;
                    }
    
                    result = temp + result;
                }
    
                x /= 16;
            }
    
            return result;
        }
    
        public static int HexToDec(string x)
        {
            int result = 0;
            int count = x.Length - 1;
            for (int i = 0; i < x.Length; i++)
            {
                int temp = 0;
                switch (x[i])
                {
                    case 'A': temp = 10; break;
                    case 'B': temp = 11; break;
                    case 'C': temp = 12; break;
                    case 'D': temp = 13; break;
                    case 'E': temp = 14; break;
                    case 'F': temp = 15; break;
                    default: temp = -48 + (int)x[i]; break; // -48 because of ASCII
                }
    
                result += temp * (int)(Math.Pow(16, count));
                count--;
            }
    
            return result;
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Enter Decimal value: ");
            int decNum = int.Parse(Console.ReadLine());
    
            Console.WriteLine("Dec {0} is hex {1}", decNum, Tool.DecToHex(decNum));
    
            Console.Write("\nEnter Hexadecimal value: ");
            string hexNum = Console.ReadLine().ToUpper();
    
            Console.WriteLine("Hex {0} is dec {1}", hexNum, Tool.HexToDec(hexNum));
    
            Console.ReadKey();
        }
    }
    
    0 讨论(0)
  • 2020-11-22 06:05

    Try using BigNumber in C# - Represents an arbitrarily large signed integer.

    Program

    using System.Numerics;
    ...
    var bigNumber = BigInteger.Parse("837593454735734579347547357233757342857087879423437472347757234945743");
    Console.WriteLine(bigNumber.ToString("X"));
    

    Output

    4F30DC39A5B10A824134D5B18EEA3707AC854EE565414ED2E498DCFDE1A15DA5FEB6074AE248458435BD417F06F674EB29A2CFECF
    

    Possible Exceptions,

    ArgumentNullException - value is null.

    FormatException - value is not in the correct format.

    Conclusion

    You can convert string and store a value in BigNumber without constraints about the size of the number unless the string is empty and non-analphabets

    0 讨论(0)
提交回复
热议问题