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

173

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

20个回答

335

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

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

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

int decValue = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
或者
int decValue = Convert.ToInt32(hexValue, 16);

2
我想了解这行代码 decValue.ToString("X") 是如何将其转换为十六进制的。 - gizgok
25
变量decValue的类型为Int32。Int32有一个ToString()重载方法,可以接受多种格式字符串,这些字符串指定了值在作为字符串时应该如何表示。 "X"格式字符串意味着十六进制,所以255.ToString("X")将返回十六进制字符串"FF"。更多信息请参见http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx - Andy McCluggage
2
好的回答。我实际上正在使用int.TryParse而不是int.Parse,以避免使用烦人的try catch块。 - Gaff
int.Parse没有选项让你指定基数为int,只有一些有效的NumberStyles选项。对于基数16,任何一个选项都可以,但作为一种通用解决方案,了解两种方法的工作原理是很好的。 - Tim S.
这适用于任何可以表示为整数(包括Int64)的内容,但不适用于更大的十进制或浮点数,例如20位数字等。当专门处理较大的数字时,其他答案中的一些更加正确。在int和decimal之间交替使用是危险和误导性的。 - Matt

68

十六进制 -> 十进制:

Convert.ToInt64(hexString, 16);

十进制 -> 十六进制

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

6
关于Convert.ToInt64(hexValue, 16);的好处在于它无论有没有0x前缀都可以进行转换,而其他解决方案可能不行。 - Craig
@Craig 你好,我需要根据十六进制值的大小进行转换,或者我可以对所有十六进制值应用ToInt64,会有什么影响吗? - user1219310
请务必在提供特定命名空间的解决方案时,注明它所属的命名空间! - Itération 122442
这仅适用于整数转换!十进制会抛出错误。 - Sotiris Zegiannis

29

看起来你可以说

Convert.ToInt64(value, 16)

获取十六进制数的十进制表示方法。

反过来的方法是:

otherVar.ToString("X");

1
我收到了System.FormatException:指定的格式“x”无效。 - c_Reg_c_Lark
1
这仅适用于整数。如果您想将十六进制小数转换为十进制或反之亦然,它会抛出错误。 - Sotiris Zegiannis

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

天才!不知道是否可能让字节编译器自动在 Convert.ToInt32 内使用这种方法? - Jeff Halverson
1
我看不出为什么它不能完成。然而,维护数组将消耗额外的内存。 - Vadym Stetsiak

12

来自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);

1
我使用了这种方法,在几分钟内制作了一个小的dotnet 4.0应用程序,只需几行代码即可完美运行。 - RatherLogical

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

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

这在十进制十六进制值上不起作用。 System.ArgumentException:“数字样式AllowHexSpecifier不支持浮点数据类型。” - Sotiris Zegiannis

2

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

程序

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

输出

4F30DC39A5B10A824134D5B18EEA3707AC854EE565414ED2E498DCFDE1A15DA5FEB6074AE248458435BD417F06F674EB29A2CFECF

可能的异常情况

ArgumentNullException - 值为null。

FormatException - 值不符合正确格式。

结论

您可以将字符串转换并存储在BigNumber中,而无需担心数字大小的限制,除非该字符串为空且不包含字母。


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

这似乎只是 这个答案 的重复。 - Pang

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接