這篇文章主要介紹“如何用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;
}Convert.ToInt32的第二個參數可以指定進制數,從而轉為32位的10進制int整型。
Convert.ToInt32(hexStr,16)
同理,可以根據需要,將2進制、8進制的字符串轉換為10進制的int類型。
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();
}Convert.ToString(dec, 16)的第二個參數可以指定要換為的字符串的進制數。
它轉換的結構是小寫表示的16進制,且個位數時為單數,即如果是5,其結果為"5",如果是F,其結果為"F"。
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"?!?code>X對應為大寫】。
與.ToString()方法同樣的格式化要求。
string.Format("{0:X2}", dec) 或 string.Format("{0:X}",dec) 將整型轉為16進制。
將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項目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#實現十六進制與十進制相互轉換及不同進制表示”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。