代码之家  ›  专栏  ›  技术社区  ›  Andy McCluggage hunter

如何在十六进制和十进制之间转换数字

  •  173
  • Andy McCluggage hunter  · 技术社区  · 17 年前

    如何在C#中转换十六进制数和十进制数?

    20 回复  |  直到 7 年前
        1
  •  313
  •   Legends    8 年前

    要从十进制转换为十六进制,请执行以下操作。。。

    string hexValue = decValue.ToString("X");
    

    要从十六进制转换为十进制,请执行以下任一操作。..

    int decValue = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
    

    int decValue = Convert.ToInt32(hexValue, 16);
    
        2
  •  62
  •   Jonathan Rupp    17 年前

    十六进制->十进制的:

    Convert.ToInt64(hexString, 16);
    

    十进制->十六进制

    string.Format("{0:x}", intValue);
    
        3
  •  28
  •   Peter Mortensen Pieter Jan Bonestroo    14 年前

    看起来你可以说

    Convert.ToInt64(value, 16)
    

    从十六进制中获取小数。

    另一种方式是:

    otherVar.ToString("X");
    
        4
  •  13
  •   Peter Mortensen Pieter Jan Bonestroo    11 年前

    如果你想在从十六进制到十进制的转换中获得最大的性能,你可以使用预先填充的十六进制到小数值表的方法。

    这是说明这一想法的代码。我的 performance tests 结果表明,它比Convert快20%-40%。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;
          }
      }
    
        5
  •  12
  •   Tudor    7 年前

    From Geekpedia :

    // Store integer 182
    int decValue = 182;
    
    // Convert integer 182 as a hex in a string variable
    string hexValue = decValue.ToString("X");
    
    // Convert the hex string back to the number
    int decAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
    
        6
  •  2
  •   Sklivvz    17 年前
    String stringrep = myintvar.ToString("X");
    
    int num = int.Parse("FF", System.Globalization.NumberStyles.HexNumber);
    
        7
  •  2
  •   user7925882    9 年前

    如果它是一个超出正常整数容量的非常大的十六进制字符串:

    为了。NET 3.5,我们可以使用BouncyCastle的BigInteger类:

    String hex = "68c7b05d0000000002f8";
    // results in "494809724602834812404472"
    String decimal = new Org.BouncyCastle.Math.BigInteger(hex, 16).ToString();
    

    .NET 4.0具有 BigInteger 类。

        8
  •  2
  •   Aravin Anil Kumar Kadiri    8 年前

    十六进制到十进制的转换

    Convert.ToInt32(number, 16);
    

    十进制到十六进制转换

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

    For more details Check this article

        9
  •  1
  •   Ecstatic Coder    16 年前

    尝试在C#中使用BigNumber-表示任意大的带符号整数。

    程序

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

    输出

    4F30DC39A5B10A824134D5B18EEA3707AC854EE565414ED2E498DCFDE1A15DA5FEB6074AE248458435BD417F06F674EB29A2CFECF
    

    可能的例外情况,

    ArgumentNullException-值为null。

    FormatException-值的格式不正确。

    结论

    您可以转换字符串并将值存储在BigNumber中,而不受数字大小的限制,除非字符串为空且非字母

        10
  •  1
  •   Omair    15 年前
        static string chex(byte e)                  // Convert a byte to a string representing that byte in hexadecimal
        {
            string r = "";
            string chars = "0123456789ABCDEF";
            r += chars[e >> 4];
            return r += chars[e &= 0x0F];
        }           // Easy enough...
    
        static byte CRAZY_BYTE(string t, int i)     // Take a byte, if zero return zero, else throw exception (i=0 means false, i>0 means true)
        {
            if (i == 0) return 0;
            throw new Exception(t);
        }
    
        static byte hbyte(string e)                 // Take 2 characters: these are hex chars, convert it to a byte
        {                                           // WARNING: This code will make small children cry. Rated R.
            e = e.ToUpper(); // 
            string msg = "INVALID CHARS";           // The message that will be thrown if the hex str is invalid
    
            byte[] t = new byte[]                   // Gets the 2 characters and puts them in seperate entries in a byte array.
            {                                       // This will throw an exception if (e.Length != 2).
                (byte)e[CRAZY_BYTE("INVALID LENGTH", e.Length ^ 0x02)], 
                (byte)e[0x01] 
            };
    
            for (byte i = 0x00; i < 0x02; i++)      // Convert those [ascii] characters to [hexadecimal] characters. Error out if either character is invalid.
            {
                t[i] -= (byte)((t[i] >= 0x30) ? 0x30 : CRAZY_BYTE(msg, 0x01));                                  // Check for 0-9
                t[i] -= (byte)((!(t[i] < 0x0A)) ? (t[i] >= 0x11 ? 0x07 : CRAZY_BYTE(msg, 0x01)) : 0x00);        // Check for A-F
            }           
    
            return t[0x01] |= t[0x00] <<= 0x04;     // The moment of truth.
        }
    
        11
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    11 年前

    这并不是最简单的方法,但这个源代码使您能够纠正任何类型的八进制数,即23.214、23和0.512等。希望这能对您有所帮助。。

        public string octal_to_decimal(string m_value)
        {
            double i, j, x = 0;
            Int64 main_value;
            int k = 0;
            bool pw = true, ch;
            int position_pt = m_value.IndexOf(".");
            if (position_pt == -1)
            {
                main_value = Convert.ToInt64(m_value);
                ch = false;
            }
            else
            {
                main_value = Convert.ToInt64(m_value.Remove(position_pt, m_value.Length - position_pt));
                ch = true;
            }
    
            while (k <= 1)
            {
                do
                {
                    i = main_value % 10;                                        // Return Remainder
                    i = i * Convert.ToDouble(Math.Pow(8, x));                   // calculate power
                    if (pw)
                        x++;
                    else
                        x--;
                    o_to_d = o_to_d + i;                                        // Saving Required calculated value in main variable
                    main_value = main_value / 10;                               // Dividing the main value 
                }
                while (main_value >= 1);
                if (ch)
                {
                    k++;
                    main_value = Convert.ToInt64(Reversestring(m_value.Remove(0, position_pt + 1)));
                }
                else
                    k = 2;
                pw = false;
                x = -1;
            }
            return (Convert.ToString(o_to_d));
        }    
    
        12
  •  1
  •   Dejan Dozet    5 年前

    这个为我工作:

    public static decimal HexToDec(string hex)
    {
      if (hex.Length % 2 == 1)
        hex = "0" + hex;
      byte[] raw = new byte[hex.Length / 2];
      decimal d = 0;
        for (int i = 0; i < raw.Length; i++)
        {
          raw[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
          d += Math.Pow(256, (raw.Length - 1 - i)) * raw[i];
        }
        return d.ToString();
      return d;
    }
    
        13
  •  0
  •   Mihók Balázs    11 年前

    十进制-十六进制

            var decValue = int.Parse(Console.ReadLine());
            string hex = string.Format("{0:x}", decValue);
            Console.WriteLine(hex);
    

    十六进制-十进制(使用命名空间:使用System.Globalization;)

            var hexval = Console.ReadLine();
            int decValue = int.Parse(hexval, NumberStyles.HexNumber);
            Console.WriteLine(decValue);
    
        14
  •  0
  •   sampathsris Rihards Fridrihsons    11 年前

    四种C#原生方法将Hex转换为Dec并返回:

    using System;
    
    namespace Hexadecimal_and_Decimal
    {
      internal class Program
      {
        private static void Main(string[] args)
        {
          string hex = "4DEAD";
          int dec;
    
          // hex to dec:
          dec = int.Parse(hex, System.Globalization.NumberStyles.HexNumber);
          // or:
          dec = Convert.ToInt32(hex, 16);
    
          // dec to hex:
          hex = dec.ToString("X"); // lowcase: x, uppercase: X
          // or:
          hex = string.Format("{0:X}", dec); // lowcase: x, uppercase: X
    
          Console.WriteLine("Hexadecimal number: " + hex);
          Console.WriteLine("Decimal number: " + dec);
        }
      }
    }
    
        15
  •  0
  •   MohsenB    5 年前

    我认为我的版本更容易理解,因为我的C#知识不是很高。 我使用这个算法: http://easyguyevo.hubpages.com/hub/Convert-Hex-to-Decimal (示例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();
        }
    }
    
        16
  •  0
  •   Rakibul    5 年前

    将二进制转换为十六进制

    Convert.ToString(Convert.ToUInt32(binary1, 2), 16).ToUpper()
    
        17
  •  -1
  •   Luke Puplett    15 年前

    您可以使用此代码并可能设置十六进制长度和部分:

    const int decimal_places = 4;
    const int int_places = 4;
    static readonly string decimal_places_format = $"X{decimal_places}";
    static readonly string int_places_format = $"X{int_places}";
    
    public static string DecimaltoHex(decimal number)
    {
        var n = (int)Math.Truncate(number);
        var f = (int)Math.Truncate((number - n) * ((decimal)Math.Pow(10, decimal_places)));
        return $"{string.Format($"{{0:{int_places_format}}}", n)}{string.Format($"{{0:{decimal_places_format}}}", f)}";
    }
    
    public static decimal HextoDecimal(string number)
    {
        var n = number.Substring(0, number.Length - decimal_places);
        var f = number.Substring(number.Length - decimal_places);
        return decimal.Parse($"{int.Parse(n, System.Globalization.NumberStyles.HexNumber)}.{int.Parse(f, System.Globalization.NumberStyles.HexNumber)}");
    }
    
        18
  •  -1
  •   Chris Panayotoff    12 年前

    一种将字节数组转换为十六进制表示的扩展方法。这会用前导零填充每个字节。

        /// <summary>
        /// Turns the byte array into its Hex representation.
        /// </summary>
        public static string ToHex(this byte[] y)
        {
            StringBuilder sb = new StringBuilder();
            foreach (byte b in y)
            {
                sb.Append(b.ToString("X").PadLeft(2, "0"[0]));
            }
            return sb.ToString();
        }
    
        19
  •  -1
  •   Krisztián Molnár    7 年前

    以下是我的职责:

    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();
        }
    }