65.9K
CodeProject 正在变化。 阅读更多。
Home

十进制到任意进制(二进制、八进制或十六进制)的转换以及反之(C#)

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.35/5 (23投票s)

2005年5月28日

CPOL

2分钟阅读

viewsIcon

241460

downloadIcon

3589

用C#编写的通用函数,用于将二进制、八进制或十六进制数转换为十进制数,反之亦然。

引言

C#转换函数非常强大。Convert 类有许多方法可以执行典型的 string 到整数和其他数据类型的转换。其中一个函数 ToInt64() 不仅将给定值转换为 64 位整数,还返回指定基数的数字。

Convert.ToInt64(value,16);

上面的函数将十进制数转换为十六进制数。这在编写用于算术计算的程序时最有用。我考虑编写自己的函数来执行这种转换。我创建了两个函数,DecimalToBase 将任何十进制数转换为二进制、八进制或十六进制数,BaseToDecimal 将任何二进制、八进制或十六进制数转换为相应的十进制数。

最有趣的部分是这两个函数本质上都是通用的。在 DecimalToBase 函数中,我必须编写能够执行十进制到二进制、八进制或十六进制转换的算法。我必须在单个函数中为所有这些转换编写代码,同时仍然简化我的代码以处理各种值。 C# 的类型安全特性阻止我们进行一些更容易的字符-整数转换,我们就是无法超越它们,因为它会产生不利的结果。BaseToDecimal 函数也是如此。

用于测试转换函数的示例应用程序

  • 在 Visual Studio .NET 中创建一个示例 Windows 应用程序。
  • 在窗体中
    1. 添加三个标签控件,分别命名为 label1label2label3
    2. 添加三个文本框控件,分别命名为 textBox1textBox2textBox3
    3. 放置一个按钮控件,命名为 button1,并将其 Text 属性设置为“To Base”。
    4. 放置另一个按钮控件,命名为 button2,并将其 Text 属性设置为“To Base”。
  • 将以下声明作为 form 类的数据成员写入
    const int base10 = 10;
    char[] cHexa = new char[]{'A','B','C','D','E','F'};
    int[] iHexaNumeric = new int[] {10,11,12,13,14,15};
    int[] iHexaIndices = new int[] {0,1,2,3,4,5};
    const int asciiDiff = 48;
  • 将函数作为成员方法包含在 form 类模块中。

    此函数接受两个参数:要转换的整数值和数字转换成的基数值(2、8 或 16)

    string DecimalToBase(int iDec, int numbase)
    {
        string strBin = "";
        int[] result = new int[32];
        int MaxBit = 32;
        for(; iDec > 0; iDec/=numbase)
        {
            int rem = iDec % numbase;
            result[--MaxBit] = rem;
        } 
        for (int i=0;i<result.Length;i++)
              if ((int) result.GetValue(i) >= base10)
                strBin += cHexa[(int)result.GetValue(i)%base10];
              else
                strBin += result.GetValue(i);
        strBin = strBin.TrimStart(new char[] {'0'});
        return strBin;
    }

    此函数接受两个参数:表示二进制、八进制或十六进制值的字符串值以及与第一个参数对应的整数基数值。 例如,如果您传递第一个参数值“1101”,则第二个参数应取值“2”。

    int BaseToDecimal(string sBase, int numbase)
    {
        int dec = 0;
        int b;
        int iProduct=1;
        string sHexa = "";
        if (numbase > base10)
        for (int i=0;i<cHexa.Length;i++)
            sHexa += cHexa.GetValue(i).ToString();
        for(int i=sBase.Length-1; i>=0; i--,iProduct *= numbase)
        {
            string sValue = sBase[i].ToString();
            if (sValue.IndexOfAny(cHexa) >=0)
                b=iHexaNumeric[sHexa.IndexOf(sBase[i])];
            else 
                b= (int) sBase[i] - asciiDiff;
            dec += (b * iProduct);
        } 
        return dec; 
    }
  • 在按钮的 click 事件中写入以下代码

    单击第一个按钮,您可以将十进制数转换为 ComboBox 中选择的任何基数。

    private void button1_Click(object sender, System.EventArgs e)
    {
        textBox3.Text = DecimalToBase(Int32.Parse(textBox1.Text), 
                                     Int32.Parse(comboBox1.Text));
    }

    单击第二个按钮,您可以将您在 ComboBox 中选择的基数(二进制、八进制或十六进制)转换为十进制数。

    private void button2_Click(object sender, System.EventArgs e)
    {
        textBox3.Text = BaseToDecimal(textBox1.Text, 
              Int32.Parse(comboBox1.Text)).ToString();
    }
  • 保存项目。构建解决方案。
  • 输出如下所示

示例输出 #1

示例输出 #2

示例输出 #3

示例输出 #4

© . All rights reserved.