<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在程式中,十六進位制的表示形式通常為字串;而十進位制則為數位整型(本質的記憶體儲存都是01二進位制)。數位的進位製表示一般使用的不多,通常最大的需求是進位制之間的相互轉換。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進位制字串。
/// <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進位制。
Hex
格式表示二進位制時很常用,2位16進位制FF
正好表示8位元一個位元組。dec.ToString("x2")
或 dec.ToString("x")
中使用小寫x,則轉換為對應的小寫的16進位制字串,比如15轉換為"f"或"0f"。【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(); }
效果如下:
4 ways in C# to convert a hexadecimal value to Decimal
到此這篇關於C#實現十六進位制與十進位制相互轉換以及及不同進位製表示的文章就介紹到這了,更多相關C#十六進位制與十進位制相互轉換內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45