91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

C#如何實現十六進制與十進制相互轉換功能

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

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

    前言

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

    C#中數字的進制表示形式

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

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

    比如,下面舉例的不同進制的數字表示形式:

    // 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^n,n從0開始

    • 將相乘后的結果相加到最終值

    • 以等值的十進制對應十六進制,比如 A或a作為10,B或b作為11

    代碼實現十六進制轉十進制

    下面的代碼使用上面介紹的算法,實現將十六進制字符串轉換為十進制數字,通過遍歷十六進制的字符得到最后的值。

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

    /// <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的使用,比較巧妙,推薦。代碼如下:

    /// <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;
    }

    C#內置方法16轉10進制

    Convert.ToInt32()

    Convert.ToInt32的第二個參數可以指定進制數,從而轉為32位的10進制int整型。

    Convert.ToInt32(hexStr,16)

    同理,可以根據需要,將2進制、8進制的字符串轉換為10進制的int類型。

    int.Parse()和int.TryParse

    int.Parse(hexStr,System.Globalization.NumberStyles.HexNumber) 第二個參數指定當前為HexNumber數字,實現16轉10進制。

    int.TryParse同理。

    十進制轉十六進制

    代碼實現十進制轉十六進制

    實現步驟對應上面16轉10進制的過程,代碼如下:

    /// <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();
    }

    C#內置方法10轉16進制

    Convert.ToString() 轉換數字為不同的進制

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

    它轉換的結構是小寫表示的16進制,且個位數時為單數,即如果是5,其結果為"5",如果是F,其結果為"F"。

    .ToString()方法

    dec.ToString("X2")dec.ToString("X") 將整型轉為16進制。

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

    • X表示16進制格式。

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

    string.Format()

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

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

    Convert.ToString()實現將數字轉換為特定進制的字符串

    decimal_2分別轉換為16進制、8進制、2進制的字符串

    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程序

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

    在輸入框的TextChanged中,分別完成進制的轉換

    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();
    
            }

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

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    甘谷县| 梁河县| 兴宁市| 柞水县| 陈巴尔虎旗| 石首市| 岐山县| 柳州市| 西安市| 彭州市| 宁安市| 耿马| 姚安县| 红原县| 綦江县| 永川市| 颍上县| 美姑县| 五家渠市| 绍兴县| 鹿邑县| 雷山县| 莎车县| 玉龙| 大荔县| 竹北市| 湟源县| 富民县| 淮阳县| 沁源县| 城步| 湖南省| 镶黄旗| 葵青区| 上思县| 集贤县| 南投县| 聊城市| 甘谷县| 新昌县| 广南县|