C#实现十六进制与十进制相互转换以及及不同进制转换

在程序中,十六进制的表示形式通常为字符串;而十进制则为数字整型(本质的内存存储都是01二进制)。C#中提供了内置的转换方法,同时,我们也可以依据不同进制之间的规则自己实现进制之间的转换。

1 十六进制转十进制

十六进制到十进制的转换可以通过下面的步骤实现:

  • 从十六进制数字的最右侧(个位)开始获取每一位的数字
  • 获取的数字乘以16^n,n从0开始
  • 将相乘后的结果相加到最终值
  • 以等值的十进制对应十六进制,比如 A或a作为10,B或b作为11
/// <summary>
/// 另一种16进制转10进制的处理方式,Multiplier参与*16的循环很巧妙,对Multiplier的处理很推荐,逻辑统一
/// </summary>
/// <param name="HexaDecimalString"></param>
/// <returns></returns>
public static int HexaToDecimal(string HexaDecimalString)
{
   int Decimal = 0;
   int Multiplier = 1;

   for (int i = HexaDecimalString.Length - 1; i >= 0; i--)
   {
       Decimal += HexaToDecimal(HexaDecimalString[i]) * Multiplier;
       Multiplier *= 16;
   }
   return Decimal;
}

static int HexaToDecimal(char c)
{
   switch (c)
   {
       case '0':
           return 0;
       case '1':
           return 1;
       case '2':
           return 2;
       case '3':
           return 3;
       case '4':
           return 4;
       case '5':
           return 5;
       case '6':
           return 6;
       case '7':
           return 7;
       case '8':
           return 8;
       case '9':
           return 9;
       case 'A':
       case 'a':
           return 10;
       case 'B':
       case 'b':
           return 11;
       case 'C':
       case 'c':
           return 12;
       case 'D':
       case 'd':
           return 13;
       case 'E':
       case 'e':
           return 14;
       case 'F':
       case 'f':
           return 15;
   }
   return -1;
}

2 C#内置方法16转10进制

Convert.ToInt32()  第二个参数可以指定进制数,从而转为32位的10进制int整型。

Convert.ToInt32(hexStr,16)

int.Parse()和int.TryParse

int.Parse(hexStr,System.Globalization.NumberStyles.HexNumber) 第二个参数指定当前为HexNumber数字,实现16转10进制。

3 十进制转十六进制

/// <summary>
/// 十进制数字转十六进制
/// </summary>
/// <param name="dec">十进制数字</param>
/// <param name="lower">16进制结果是否为小写,默认false</param>
/// <returns></returns>
public static string DecimalToHex(int dec, bool lower = false)
{
   var hexBuilder = new StringBuilder();
   while (dec != 0)
   {
       var currV = dec % 16;

       char currHex;
       switch (currV)
       {
           case 0:
               currHex = '0';
               break;
           case 1:
               currHex = '1';
               break;
           case 2:
               currHex = '2';
               break;
           case 3:
               currHex = '3';
               break;
           case 4:
               currHex = '4';
               break;
           case 5:
               currHex = '5';
               break;
           case 6:
               currHex = '6';
               break;
           case 7:
               currHex = '7';
               break;
           case 8:
               currHex = '8';
               break;
           case 9:
               currHex = '9';
               break;
           case 10:
               currHex = 'A';
               break;
           case 11:
               currHex = 'B';
               break;
           case 12:
               currHex = 'C';
               break;
           case 13:
               currHex = 'D';
               break;
           case 14:
               currHex = 'E';
               break;
           case 15:
               currHex = 'F';
               break;
           default:
               currHex = '-';
               break;
       }
       // 从个位即最右边开始往前获取16进制值
       hexBuilder.Insert(0, currHex);

       dec /= 16;
   }

   return lower ? hexBuilder.ToString().ToLower() : hexBuilder.ToString();
}

4 C#内置方法10转16进制

Convert.ToString() 转换数字为不同的进制

Convert.ToString(dec, 16)的第二个参数可以指定要换为的字符串的进制数。

它转换的结构是小写表示的16进制,且个位数时为单数,即如果是5,其结果为"5",如果是F,其结果为"F"。

.ToString()方法

dec.ToString("X2") 或 dec.ToString("X") 将整型转为16进制。

  • X2表示个位是两位的16进制,比如5表示为"05",F表示为"0F"。在用Hex格式表示二进制时很常用,2位16进制FF正好表示8位一个字节。
  • X表示16进制格式。

dec.ToString("x2") 或 dec.ToString("x") 中使用小写x,则转换为对应的小写的16进制字符串,比如15转换为"f"或"0f"。【X对应为大写】。

string.Format()

.ToString()方法同样的格式化要求。

string.Format("{0:X2}", dec) 或 string.Format("{0:X}",dec) 将整型转为16进制。

hexFromTxt.TextChanged += HexFromTxt_TextChanged;
decFromTxt.TextChanged += DecFromTxt_TextChanged;
 
// .......
 
        private void DecFromTxt_TextChanged(object sender, EventArgs e)
        {
            var decStr = decFromTxt.Text.Trim();
            if (!int.TryParse(decStr, out int dec))
            {
                // 不是数字或者不能正确的转为数字则清空
                decFromTxt.Text =hexToTxt.Text = "";
                return;
            }
 
            var hex1 = HexDecConvert.DecimalToHex(dec);
            hexToTxt.Text = hex1;
 
            var tmp = Convert.ToString(dec, 16); // ab..f等为小写表示
            // X2表示两位的16进制,比如5表示为05
            // X表示16进制格式
            var tmp2 = dec.ToString("X2");
            var tmp3 = string.Format("{0:X2}", dec);
 
        }
 
        private void HexFromTxt_TextChanged(object sender, EventArgs e)
        {
            var hex = hexFromTxt.Text.Trim();
            var dec1 = HexDecConvert.HexToDecimal(hex);
            var dec2 = HexDecConvert.HexaToDecimal(hex);
            decToTxt.Text = dec1.ToString();
            decToTxt2.Text = dec2.ToString();
 
        }

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值