对于进制的表示,编程语言基本上都提供了特殊前缀表示不同进制的数字,一般0x
/0X
表示16进制、0o
/0O
表示8进制、0b
/0B
表示2进制,十进制数字则没有特殊前缀,直接输入数字即可。
C#中没有对8进制数字的直接表示形式。对于这个几乎用不到的历史遗留的进制,编程中很少会使用。通常比较常用的是2进制和16进制。
比如,下面举例的不同进制的数字表示形式:
1 | // 16进制表示var hexadecimal = 0xaf2;Console.WriteLine(hexadecimal); // 2802?// 2进制表示var binary = 0b1011110000;Console.WriteLine(binary);? // 752?// 10进制var decimal_ = 910;Console.WriteLine(decimal_); // 910 |
---|
十六进制到十进制的转换可以通过下面的步骤实现:
下面的代码使用上面介绍的算法,实现将十六进制字符串转换为十进制数字,通过遍历十六进制的字符得到最后的值。
使用正则验证传入的是否是合格的16进制字符串。
2 | /// <summary>/// Hex十六进制数字转十进制/// </summary>/// <param name="hex"></param>/// <returns></returns>public static int HexToDecimal(string hex){???if (!Regex.Match(hex, "^[0-9A-F]$", RegexOptions.IgnoreCase).Success)???{???????throw new Exception("不是十六进制数字");???}????var decimalValue = 0;????var hexUp = hex.ToUpper();???// 从最后一位到第一位循环获取每位的值,并乘以基数的n-1次方???for (int i = hexUp.Length-1; i >= 0; i--)???{???????int currV = 0;???????switch (hexUp[i])???????{???????????case 'A':???????????????currV = 10;???????????????break;???????????case 'B':???????????????currV = 11;???????????????break;???????????case 'C':???????????????currV = 12;???????????????break;???????????case 'D':???????????????currV = 13;???????????????break;???????????case 'E':???????????????currV = 14;???????????????break;???????????case 'F':???????????????currV = 15;???????????????break;???????????case '0':???????????????currV = 0;???????????????break;???????????case '1':???????????????currV = 1;???????????????break;???????????case '2':???????????????currV = 2;???????????????break;???????????case '3':???????????????currV = 3;???????????????break;???????????case '4':???????????????currV = 4;???????????????break;???????????case '5':???????????????currV = 5;???????????????break;???????????case '6':???????????????currV = 6;???????????????break;???????????case '7':???????????????currV = 7;???????????????break;???????????case '8':???????????????currV = 8;???????????????break;???????????case '9':???????????????currV = 9;???????????????break;???????????default:???????????????break;???????}????????for (int n = 0; n < hexUp.Length - 1 -i; n++)???????{???????????currV *= 16;???????}???????decimalValue += currV;???}???return decimalValue;} |
---|
基本逻辑和介绍的一致。
参考文章中给出了更加清晰的逻辑处理,和介绍的处理算法完全逻辑一致,尤其Multiplier的使用,比较巧妙,推荐。代码如下:
3 | /// <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;} |
---|
Convert.ToInt32
的第二个参数可以指定进制数,从而转为32位的10进制int整型。
4 | Convert.ToInt32(hexStr,16) |
---|
同理,可以根据需要,将2进制、8进制的字符串转换为10进制的int类型。
int.Parse(hexStr,System.Globalization.NumberStyles.HexNumber)
第二个参数指定当前为HexNumber数字,实现16转10进制。
int.TryParse
同理。
实现步骤对应上面16转10进制的过程,代码如下:
5 | /// <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();} |
---|
Convert.ToString(dec, 16)
的第二个参数可以指定要换为的字符串的进制数。
它转换的结构是小写表示的16进制,且个位数时为单数,即如果是5,其结果为"5",如果是F,其结果为"F"。
dec.ToString("X2")
或 dec.ToString("X")
将整型转为16进制。
Hex
格式表示二进制时很常用,2位16进制FF
正好表示8位一个字节。dec.ToString("x2")
或 dec.ToString("x")
中使用小写x,则转换为对应的小写的16进制字符串,比如15转换为"f"或"0f"。【X
对应为大写】。
与.ToString()
方法同样的格式化要求。
string.Format("{0:X2}", dec)
或 string.Format("{0:X}",dec)
将整型转为16进制。
将decimal_2
分别转换为16进制、8进制、2进制的字符串
6 | var decimal_2 = 15;Console.WriteLine($"{decimal_2}的16进制表示{Convert.ToString(decimal_2, 16)}");Console.WriteLine($"{decimal_2}的8进制表示{Convert.ToString(decimal_2, 8)}");Console.WriteLine($"{decimal_2}的2进制表示{Convert.ToString(decimal_2, 2)}");// 15的16进制表示f// 15的8进制表示17// 15的2进制表示1111 |
---|
新建一个简单的Winform项目HEXAndDECInterConvert
,窗体添加从16进制的TextBox输入框转为10进制TextBox输出框、从10进制的TextBox输入框转为16进制TextBox输出框。
在输入框的TextChanged中,分别完成进制的转换
7 | 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();?????????} |
---|
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。