介绍
此类库支持2(二进制)到36之间任意进制的转换。
类库提供了一些常见的转换(如二进制到十进制),也支持高级的转换(如20进制到5进制)
快速使用:内置转换器
Convert.BinToDec.Convert()
Convert.BinToHex.Convert()
Convert.BinToOct.Convert()
Convert.DecToBin.Convert()
Convert.DecToHex.Convert()
//将 FFF(hex)转化为二进制
string binary = Converter.HexToBin.Convert("FFFF");
高级功能:自定义转化器
除了内置的静态转换器,您还可以自定义转换。例如:
// 将 FFFF (hex) 转化为5:
string base5 = Converter.Convert(NumberBases.Hexadecimal, 5, "FFFF");
主要代码:
/// <summary>
/// 常见的进制转换
/// </summary>
public enum NumberBases
{
Binary = 2,//二进制
Octal = 8,//八进制
Decimal = 10,//十进制
Hexadecimal = 16//十六进制
}
/// <summary>
/// 返回用于在指定的编号方案中使用的字符
/// </summary>
/// <param name="scheme"></param>
/// <returns></returns>
private static string GetCharactersForNumberingScheme(NumberingSchemes scheme)
{
string characters;
switch(scheme)
{
case NumberingSchemes.AToZ:
characters = "_ABCDEFGHIJKLMNOPQRSTUVWXYZ";
break;
case NumberingSchemes.ZeroToZ:
characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
break;
default:
throw new ArgumentOutOfRangeException("scheme");
}
return characters;
}
/// <summary>
/// 将指定的数转化为10进制
/// </summary>
/// <param name="value"></param>
/// <param name="fromBase"></param>
/// <param name="characters"></param>
/// <param name="maxFromSchemeCharacter"></param>
/// <returns></returns>
private static long ConvertToBase10(string value,int fromBase,string characters,int maxFromSchemeCharacter)
{
StringBuilder fromValue = new StringBuilder(value);
int power = 0;
long result = 0;
while(fromValue.Length>0)
{
int index = Array.IndexOf<char>(characters.ToCharArray(), fromValue[fromValue.Length - 1]);
if (index < 0)
throw new FormatException("Unsupported character in value string");
if (index >= maxFromSchemeCharacter)
throw new FormatException("Value contains character not valid for number base");
result += (index * (long)Math.Pow(fromBase, power));
//溢出检查
if (result < 0)
throw new OverflowException();
fromValue.Length--;
power++;
}
return result;
}
/// <summary>
/// 将指定的字符从10进制转化为指定的进制
/// </summary>
/// <param name="value"></param>
/// <param name="toBase"></param>
/// <param name="characters"></param>
/// <returns></returns>
private static string ConvertFromBase10(long value,int toBase,string characters)
{
StringBuilder builer = new StringBuilder();
while(value>0)
{
int remainder = (int)(value % toBase);
builer.Insert(0, characters[remainder]);
value /= toBase;
}
return builer.ToString();
}
完整代码下载:
DEMO:
try
{
int fromBase = int.Parse(DropDownList1.SelectedValue);
int toBase = int.Parse(DropDownList2.SelectedValue);
TextBox3.Text = Converter.Convert(fromBase, toBase, TextBox2.Text);
}
catch (Exception ex)
{
TextBox3.Text = ex.Message;
}