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

问题描述 投票:0回答:21

C#中如何进行十六进制数和十进制数之间的转换?

c# hex type-conversion decimal
21个回答
338
投票

要将十进制转换为十六进制...

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

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

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

int decValue = Convert.ToInt32(hexValue, 16);

71
投票

十六进制 -> 十进制:

Convert.ToInt64(hexString, 16);

十进制 -> 十六进制

string.Format("{0:x}", intValue);

29
投票

看来你可以说

Convert.ToInt64(value, 16)

从十六进制得到十进制。

相反的是:

otherVar.ToString("X");

14
投票

如果您希望在从十六进制数转换为十进制数时获得最大性能,可以使用该方法以及预先填充的十六进制到十进制值表。

这是说明这个想法的代码。我的性能测试表明它可以比 Convert.ToInt32(...) 快 20%-40%:

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

12
投票

来自极客百科

// 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);

3
投票
String stringrep = myintvar.ToString("X");

int num = int.Parse("FF", System.Globalization.NumberStyles.HexNumber);

2
投票

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

对于.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 类。


2
投票

十六进制到十进制转换

Convert.ToInt32(number, 16);

十进制到十六进制转换

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

更多详情请查看这篇文章


2
投票

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

节目

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

输出

4F30DC39A5B10A824134D5B18EEA3707AC854EE565414ED2E498DCFDE1A15DA5FEB6074AE248458435BD417F06F674EB29A2CFECF

可能的例外,

ArgumentNullException - 值为空。

FormatException - 值的格式不正确。

结论

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


1
投票
    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.
    }

1
投票

这并不是最简单的方法,但此源代码使您能够纠正任何类型的八进制数,即 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));
    }    

1
投票

这个对我有用:

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

1
投票

十进制 - 十六进制

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

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

        var hexval = Console.ReadLine();
        int decValue = int.Parse(hexval, NumberStyles.HexNumber);
        Console.WriteLine(decValue);

1
投票

将十六进制转换为十进制以及反向转换的四种 C# 原生方法:

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

0
投票

我的版本是我认为更容易理解的,因为我的 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();
    }
}

0
投票

将二进制转换为十六进制

Convert.ToString(Convert.ToUInt32(binary1, 2), 16).ToUpper()

0
投票

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

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

0
投票

您最好使用 Andy 提到的现有方法,因为它们已经过优化。

但是,如果您想自己实现或使用 C# 之外的其他编程语言,您可以执行以下操作:

十六进制转十进制

int HexToDecimal(string hex)
{
    int decimalValue = 0;

    for(int i = 0; i < hex.Length; i++) 
    {
       int currentValue = 0;

       if (hex[i] >= '0' && hex[i] <= '9') 
       {
           currentValue = hex[i] - '0';
       }
       else if (hex[i] >= 'A' && hex[i] <= 'F') 
       {
           currentValue = hex[i] - 'A' + 10
       }
       else 
       {
           // do what you want, this block is not necessary
       }

       decimalValue = decimalValue * 16 + currentValue;
    }
    
    return decimalValue;
}

十进制到十六进制

string DecimalToHexadecimal(int number)
{
    string hex = "";

    while (number > 0)
    {
        int remainder = number % 16; // bc hexadecimal is base 16

        if (remainder < 10) // then we know we are between 0-9
            hex = remainder + hex; 
        else // here we know we are from A - F (10 - 15)
            hex = (char)(remainder - 10 + 'A') + hex; // same logic as in hex to decimal conversion, except we want the char now

        number /= 16; // divide by the base of hex
    }

    return hex;
}

-1
投票

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

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

-1
投票

这是我的功能:

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

-1
投票

我的解决方案有点像回归基础,但它无需使用任何内置函数即可在数字系统之间进行转换。

    public static string DecToHex(long a)
    {
        int n = 1;
        long b = a;
        while (b > 15)
        {
            b /= 16;
            n++;
        }
        string[] t = new string[n];
        int i = 0, j = n - 1;
        do
        {
                 if (a % 16 == 10) t[i] = "A";
            else if (a % 16 == 11) t[i] = "B";
            else if (a % 16 == 12) t[i] = "C";
            else if (a % 16 == 13) t[i] = "D";
            else if (a % 16 == 14) t[i] = "E";
            else if (a % 16 == 15) t[i] = "F";
            else t[i] = (a % 16).ToString();
            a /= 16;
            i++;
        }
        while ((a * 16) > 15);
        string[] r = new string[n];
        for (i = 0; i < n; i++)
        {
            r[i] = t[j];
            j--;
        }
        string res = string.Concat(r);
        return res;
    }
© www.soinside.com 2019 - 2024. All rights reserved.