二进制-八进制-十进制-16进制之间的转换
进制之间的转换
主要用到连个函数:
Convert.ToInt32(str,numbased):将字符串转成str,按照numbeased指定的进制转成10进制数;
Convert.ToString(decimalNum,numbased):将十进制数decimalNum转成numberbased指定的进制字符串
十进制转 二进制,八进制,16进制
//10进制转成二进制 Convert.ToString(999,2); //10进制转成8进制 Convert.ToString(999,8); //10进制转16进制 Convert.ToString(999,16); //或者 string.Format("{0:X}", 999);
二进制 转 8进制 ,10进制,16进制
// 2 进制转 8进制 //假如二进制是字符串 strb string strb="0101111"; int tmp =Convert.ToInt32(strb,2);//按照2进制解析成10进制数 //使用10进制转成其他进制来进行转换 Convert.ToString(tmp,8); //2 进制转10,16进制都是这样推导的
8进制转 2进制 10进制 ,16进制的方法同上
16进制 转 2进制 8进制10进制 同上
当对字符串转成其他进制的过程中,需要对对应进制判断是否符合进制数的要求:
使用正则来校验 进制数字符串
//判断是否是二进制 public static bool IsBinary(string str) { return Regex.IsMatch(str, "^[0-1]+$"); } //判断是否是八进制数 public static bool IsOctal(string str) { return Regex.IsMatch(str, "^[0-7]+$"); } //判断是否十进制数 public static bool IsDecimal(string str) { return Regex.IsMatch(str, "^[0-9]+$"); } //判断是否十六进制数 public static bool IsHexDecimal(string str) { return Regex.IsMatch(str, "^[0-9A-Fa-f]+$"); }
下面进入正题:效果图
窗体代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; //正则校验 using System.Text.RegularExpressions; namespace Conversion { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnConvert_Click(object sender, EventArgs e) { Action(); } //进制转换实现方法 private void Action() { //获取输入 string input_str = textBoxInput.Text; switch(comboBoxBerforBase.SelectedIndex) { case 0://二进制转其他进制 //根据选择自动的进行转换 if(Transform.IsBinary(input_str)) { textBoxResult.Text = new Transform().BinaryTo(input_str, comboBoxTargetBase.SelectedIndex); } else { MessageBox.Show("输入的数字不是有效的二进制数", "提示"); return; } break; case 1: if (Transform.IsOctal(input_str)) { textBoxResult.Text = new Transform().OctalTo(input_str, comboBoxTargetBase.SelectedIndex); } else { MessageBox.Show("输入的数字不是有效的八进制数", "提示"); return; } break; case 2: if (Transform.IsDecimal(input_str)) { textBoxResult.Text = new Transform().DecimalTo(input_str, comboBoxTargetBase.SelectedIndex); } else { MessageBox.Show("输入的数字不是有效10进制数", "提示"); return; } break; case 3: if (Transform.IsHexDecimal(input_str)) { textBoxResult.Text = new Transform().HexDecimallTo(input_str, comboBoxTargetBase.SelectedIndex); } else { MessageBox.Show("输入的数字不是有效16进制数", "提示"); return; } break; } } } }
新建TransForm类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //正则校验 using System.Text.RegularExpressions; namespace Conversion { //使用反射应该更好===后期学完其他知识后,更新一下优化的代码 class Transform { //判断是否是二进制 public static bool IsBinary(string str) { return Regex.IsMatch(str, "^[0-1]+$"); } //判断是否是八进制数 public static bool IsOctal(string str) { return Regex.IsMatch(str, "^[0-7]+$"); } //判断是否十进制数 public static bool IsDecimal(string str) { return Regex.IsMatch(str, "^[0-9]+$"); } //判断是否十六进制数 public static bool IsHexDecimal(string str) { return Regex.IsMatch(str, "^[0-9A-Fa-f]+$"); } //二进制转其他进制 2 --》 2 8 10 16 public string BinaryTo(string str,int NumBased) { string result = ""; if(IsBinary(str))//如果是二进制 { switch(NumBased) { case 0://转换成本身 default://不在范围内就原先字符码显示 result = str; break; case 1://转成8进制 int tmp = Convert.ToInt32(str, 2);//十进制 result = Convert.ToString(tmp,8);//十进制--》8进制 break; case 2://转成10进制 result = Convert.ToInt32(str,2).ToString(); break; case 3://转成16进制 result = string.Format("{0:X}", Convert.ToInt32(str, 2)); break; } } return result; } //8进制转其他进制 8 --》 2 8 10 16 public string OctalTo(string str, int NumBased) { string result = ""; if (IsOctal(str))//如果是8进制 { switch (NumBased) { case 1://转换成本身 default://不在范围内就原先字符码显示 result = str; break; case 0://转成2进制 int tmp = Convert.ToInt32(str, 8);//十进制 result = Convert.ToString(tmp, 2);//十进制--》2进制 break; case 2://转成10进制 result = Convert.ToInt32(str, 8).ToString(); break; case 3://转成16进制 result = string.Format("{0:X}", Convert.ToInt32(str, 8)); break; } } return result; } //10进制转其他进制 10--》 2 8 10 16 public string DecimalTo(string str, int NumBased) { string result = ""; if (IsDecimal(str))//如果是8进制 { switch (NumBased) { case 2://转换成本身 default://不在范围内就原先字符码显示 result = str; break; case 0://转成2进制 int tmp_ = Convert.ToInt32(str, 10);//十进制 result = Convert.ToString(tmp_, 2);//十进制--》2进制 break; case 1://转成8进制 int tmp_1 = Convert.ToInt32(str, 10); result = Convert.ToString(tmp_1, 8); break; case 3://转成16进制 result = string.Format("{0:X}", Convert.ToInt32(str, 10)); break; } } return result; } //16进制转其他进制 16--》 2 8 10 16 public string HexDecimallTo(string str, int NumBased) { string result = ""; if (IsHexDecimal(str))//如果是16进制 { switch (NumBased) { case 3://转换成本身 default://不在范围内就原先字符码显示 result = str; break; case 0://转成2进制 int tmp_ = Convert.ToInt32(str, 16);//十进制 result = Convert.ToString(tmp_, 2);//十进制--》2进制 break; case 1://转成8进制 int tmp_1 = Convert.ToInt32(str, 16); result = Convert.ToString(tmp_1, 8); break; case 2://转成10进制 result = Convert.ToInt32(str, 16).ToString(); break; } } return result; } } }