溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#如何實現(xiàn)十六進(jìn)制與十進(jìn)制相互轉(zhuǎn)換功能

發(fā)布時間:2022-10-20 15:05:31 來源:億速云 閱讀:232 作者:iii 欄目:編程語言

這篇文章主要介紹了C#如何實現(xiàn)十六進(jìn)制與十進(jìn)制相互轉(zhuǎn)換功能的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C#如何實現(xiàn)十六進(jìn)制與十進(jìn)制相互轉(zhuǎn)換功能文章都會有所收獲,下面我們一起來看看吧。

    前言

    在程序中,十六進(jìn)制的表示形式通常為字符串;而十進(jìn)制則為數(shù)字整型(本質(zhì)的內(nèi)存存儲都是01二進(jìn)制)。數(shù)字的進(jìn)制表示一般使用的不多,通常最大的需求是進(jìn)制之間的相互轉(zhuǎn)換。C#中提供了內(nèi)置的轉(zhuǎn)換方法,同時,我們也可以依據(jù)不同進(jìn)制之間的規(guī)則自己實現(xiàn)進(jìn)制之間的轉(zhuǎn)換。

    C#中數(shù)字的進(jìn)制表示形式

    對于進(jìn)制的表示,編程語言基本上都提供了特殊前綴表示不同進(jìn)制的數(shù)字,一般0x/0X表示16進(jìn)制、0o/0O表示8進(jìn)制、0b/0B表示2進(jìn)制,十進(jìn)制數(shù)字則沒有特殊前綴,直接輸入數(shù)字即可。

    C#中沒有對8進(jìn)制數(shù)字的直接表示形式。對于這個幾乎用不到的歷史遺留的進(jìn)制,編程中很少會使用。通常比較常用的是2進(jìn)制和16進(jìn)制。

    比如,下面舉例的不同進(jìn)制的數(shù)字表示形式:

    // 16進(jìn)制表示
    var hexadecimal = 0xaf2;
    Console.WriteLine(hexadecimal); // 2802
    
    // 2進(jìn)制表示
    var binary = 0b1011110000;
    Console.WriteLine(binary);  // 752
    
    // 10進(jìn)制
    var decimal_ = 910;
    Console.WriteLine(decimal_); // 910

    十六進(jìn)制轉(zhuǎn)十進(jìn)制

    十六進(jìn)制到十進(jìn)制的轉(zhuǎn)換可以通過下面的步驟實現(xiàn):

    • 從十六進(jìn)制數(shù)字的最右側(cè)(個位)開始獲取每一位的數(shù)字

    • 獲取的數(shù)字乘以16^n,n從0開始

    • 將相乘后的結(jié)果相加到最終值

    • 以等值的十進(jìn)制對應(yīng)十六進(jìn)制,比如 A或a作為10,B或b作為11

    代碼實現(xiàn)十六進(jìn)制轉(zhuǎn)十進(jìn)制

    下面的代碼使用上面介紹的算法,實現(xiàn)將十六進(jìn)制字符串轉(zhuǎn)換為十進(jìn)制數(shù)字,通過遍歷十六進(jìn)制的字符得到最后的值。

    使用正則驗證傳入的是否是合格的16進(jìn)制字符串。

    /// <summary>
    /// Hex十六進(jìn)制數(shù)字轉(zhuǎn)十進(jìn)制
    /// </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("不是十六進(jìn)制數(shù)字");
       }
    
       var decimalValue = 0;
    
       var hexUp = hex.ToUpper();
       // 從最后一位到第一位循環(huán)獲取每位的值,并乘以基數(shù)的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的使用,比較巧妙,推薦。代碼如下:

    /// <summary>
    /// 另一種16進(jìn)制轉(zhuǎn)10進(jìn)制的處理方式,Multiplier參與*16的循環(huán)很巧妙,對Multiplier的處理很推薦,邏輯統(tǒng)一
    /// </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;
    }

    C#內(nèi)置方法16轉(zhuǎn)10進(jìn)制

    Convert.ToInt32()

    Convert.ToInt32的第二個參數(shù)可以指定進(jìn)制數(shù),從而轉(zhuǎn)為32位的10進(jìn)制int整型。

    Convert.ToInt32(hexStr,16)

    同理,可以根據(jù)需要,將2進(jìn)制、8進(jìn)制的字符串轉(zhuǎn)換為10進(jìn)制的int類型。

    int.Parse()和int.TryParse

    int.Parse(hexStr,System.Globalization.NumberStyles.HexNumber) 第二個參數(shù)指定當(dāng)前為HexNumber數(shù)字,實現(xiàn)16轉(zhuǎn)10進(jìn)制。

    int.TryParse同理。

    十進(jìn)制轉(zhuǎn)十六進(jìn)制

    代碼實現(xiàn)十進(jìn)制轉(zhuǎn)十六進(jìn)制

    實現(xiàn)步驟對應(yīng)上面16轉(zhuǎn)10進(jìn)制的過程,代碼如下:

    /// <summary>
    /// 十進(jìn)制數(shù)字轉(zhuǎn)十六進(jìn)制
    /// </summary>
    /// <param name="dec">十進(jìn)制數(shù)字</param>
    /// <param name="lower">16進(jìn)制結(jié)果是否為小寫,默認(rèn)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進(jìn)制值
           hexBuilder.Insert(0, currHex);
    
           dec /= 16;
       }
    
       return lower ? hexBuilder.ToString().ToLower() : hexBuilder.ToString();
    }

    C#內(nèi)置方法10轉(zhuǎn)16進(jìn)制

    Convert.ToString() 轉(zhuǎn)換數(shù)字為不同的進(jìn)制

    Convert.ToString(dec, 16)的第二個參數(shù)可以指定要換為的字符串的進(jìn)制數(shù)。

    它轉(zhuǎn)換的結(jié)構(gòu)是小寫表示的16進(jìn)制,且個位數(shù)時為單數(shù),即如果是5,其結(jié)果為"5",如果是F,其結(jié)果為"F"。

    .ToString()方法

    dec.ToString("X2")dec.ToString("X") 將整型轉(zhuǎn)為16進(jìn)制。

    • X2表示個位是兩位的16進(jìn)制,比如5表示為"05",F(xiàn)表示為"0F"。在用Hex格式表示二進(jìn)制時很常用,2位16進(jìn)制FF正好表示8位一個字節(jié)。

    • X表示16進(jìn)制格式。

    dec.ToString("x2")dec.ToString("x") 中使用小寫x,則轉(zhuǎn)換為對應(yīng)的小寫的16進(jìn)制字符串,比如15轉(zhuǎn)換為"f"或"0f"。【X對應(yīng)為大寫】。

    string.Format()

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

    string.Format("{0:X2}", dec)string.Format("{0:X}",dec) 將整型轉(zhuǎn)為16進(jìn)制。

    Convert.ToString()實現(xiàn)將數(shù)字轉(zhuǎn)換為特定進(jìn)制的字符串

    decimal_2分別轉(zhuǎn)換為16進(jìn)制、8進(jìn)制、2進(jìn)制的字符串

    var decimal_2 = 15;
    Console.WriteLine($"{decimal_2}的16進(jìn)制表示{Convert.ToString(decimal_2, 16)}");
    Console.WriteLine($"{decimal_2}的8進(jìn)制表示{Convert.ToString(decimal_2, 8)}");
    Console.WriteLine($"{decimal_2}的2進(jìn)制表示{Convert.ToString(decimal_2, 2)}");
    // 15的16進(jìn)制表示f
    // 15的8進(jìn)制表示17
    // 15的2進(jìn)制表示1111

    實現(xiàn)進(jìn)制轉(zhuǎn)換的Winform程序

    新建一個簡單的Winform項目HEXAndDECInterConvert,窗體添加從16進(jìn)制的TextBox輸入框轉(zhuǎn)為10進(jìn)制TextBox輸出框、從10進(jìn)制的TextBox輸入框轉(zhuǎn)為16進(jìn)制TextBox輸出框。

    在輸入框的TextChanged中,分別完成進(jìn)制的轉(zhuǎn)換

    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))
                {
                    // 不是數(shù)字或者不能正確的轉(zhuǎn)為數(shù)字則清空
                    decFromTxt.Text =hexToTxt.Text = "";
                    return;
                }
    
                var hex1 = HexDecConvert.DecimalToHex(dec);
                hexToTxt.Text = hex1;
    
                var tmp = Convert.ToString(dec, 16); // ab..f等為小寫表示
                // X2表示兩位的16進(jìn)制,比如5表示為05
                // X表示16進(jìn)制格式
                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();
    
            }

    關(guān)于“C#如何實現(xiàn)十六進(jìn)制與十進(jìn)制相互轉(zhuǎn)換功能”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“C#如何實現(xiàn)十六進(jìn)制與十進(jìn)制相互轉(zhuǎn)換功能”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI