Create Hexadecimal to Decimal Converter in C#

Posted by ေတဇာလင္း Monday, 7 November 2016 0 comments

မိတ္ေဆြ၊ ညီအစ္ကို၊ ေမာင္ႏွမအားလံုးပဲ မဂၤလာပါဗ်ာ။ က်ေနာ္တို႔ရဲ႕ မၿပီးျပတ္ေသးတဲ့ Number System အေၾကာင္းေလးကို ေရွ႕ဆက္ၾကည့္ၾကရေအာင္ပါ။ ဒီေန႔ေတာ့ Hexadecimal Number တစ္ခုကို Decimal Number အျဖစ္ ဘရ္လိုေျပာင္းလဲ ယူႏိုင္မလဲဆိုတာေလးကို ေလ့လာၾကည့္ၾကမွာျဖစ္ပါတရ္။ မိတ္ေဆြတို႔ ပိုၿပီးနားလည္သြားေအာင္ က်ေနာ္ Hexadecimal ကေန Decimal ေျပာင္းတာကို ေအာက္မွာ ဥပမာေလးနဲ႔ အရင္ျပပါ့မရ္။
eg. Hex = 1AD, Dec =?
so, Hex   = (1 x 16(2)) +  (10 x 16(1)) + (13 x 16(0))
          = 256         +    160        +    13  
          = 429<10>
Hex(1AD)  = Dec(429)

အနည္းငယ္ရွင္းရမရ္ဆိုရင္ေတာ... Hexadecimal ကေန Decimal ေျပာင္းမွာျဖစ္တဲ့အတြက္ ကိန္းစဥ္တန္းရဲ႕ ေနရာလိုက္တန္ဖိုးအတိုင္း Power တင္ၿပီး 16 နဲ႔ ေျမွာက္ယူပါတရ္။ ရလာတဲ့ တန္ဖိုးအသီးသီးကို ျပန္ေပါင္းေပးျခင္း ျဖင့္ က်ေနာ္တို႔ လိုအပ္ေနတဲ့ Decimal Number တစ္ခုကို ဆြဲထုတ္ယူလိုက္တာပဲျဖစ္ပါတရ္ဗ်။ နားလည္မရ္လို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။
ကဲ... အခုဆိုရင္ က်ေနာ္တို႔ Logic အေတြးကိုလည္း နားလည္သြားၿပီဆိုေတာ့ Coding Flow ေလးကို ဆက္ေလ့လာၾကည့္ၾကမရ္။
  1. ပထမဦးဆံုး မိတ္ေဆြတို႔ရိုက္ထည့္လိုက္တဲ့ Hexadecimal Number ကို ToCharArray() Method အားအသံုးျပဳၿပီး HexArr ဆိုတဲ့ Char Array တစ္ခုအျဖင့္ ဖန္တီးယူလိုက္ပါတရ္။
  2. ဒုတိယအေနနဲ႔ ၄င္းရရွိလာတဲ့ Hex Char Array ကို တိုက္ဆိုင္စစ္ေဆးဖို႔အတြက္ HexDigit 16 သာ ပါရွိတဲ့ HexDigits Array တစ္ခုကို ႀကိဳတင္ ဖန္တီးထားလိုက္ပါတရ္။
  3. ေနာက္တစ္ဆင့္မွာေတာ့ for( )loop ကိုအသံုးျပဳၿပီး HexArr ကိုေရာ HexDigits ကိုေရာ loop ဆံုးသည္အထိ ပတ္ပါတရ္။
  4. ေနာက္တစ္ဆင့္မွာေတာ့ loop အတြင္းမွာ HexArr ထဲက Item နဲ႔ HexDigits ထဲက Item ကို တူမတူ if( ) statement နဲ႔ တိုက္ဆိုင္ စစ္ေဆးပါတရ္။
  5. တူညီတဲ့ Item ေတြၿပီဆိုရင္ေတာ့ Dec += (int)(j * Math.Pow(16, power)); formula ကိုအသံုးျပဳၿပီး Decimal တန္ဖိုးတစ္ခုကို ဆြဲထုတ္ယူပါတရ္။
  6. ဒီနည္းအတိုင္းပဲ loop ဆံုးသည္အထိ သြားၿပီး loop တခါပတ္တိုင္းရရွိလာတဲ့ Decimal တန္းဖိုးေတြကို ေပါင္းေပးျခင္းျဖင့္ က်ေနာ္တို႔ လိုခ်င္ေနတဲ့ Decimal တန္ဖိုးကိုရရွိမွာျဖစ္ပါတရ္ဗ်ာ။
ဒီ Conversion ေလးရဲ႕ GUI ကိုေတာ့ ေအာက္ပါအတိုင္း ခ်ထားပါတရ္ဗ်။ မိတ္ေဆြတို႔အေနနဲ႔ ႀကိဳက္ႏွစ္သတ္ရာ ပံုစံ Tool ေတြနဲ႔ ဖန္တီးယူႏိုင္ပါတရ္။
ပိုၿပီး နားလည္သြားေအာင္ Coding အျပည့္အစံုေလးကို ေအာက္မွာ ေလ့လာၾကည့္လိုက္ၾကပါအံုးဗ်ာ။
using System;
using System.Windows.Forms;

namespace NumberTypeConverter
{
    public partial class HexadecimalConversion : Form
    {
        public HexadecimalConversion()
        {
            InitializeComponent();
        }

        public long HexToDecimal(string hex)
        {
            long Dec = 0;
            int power = 0;
            char[] HexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
'A', 'B', 'C', 'D', 'E', 'F'};
            char[] HexArr = hex.ToCharArray();
            for (int i = HexArr.Length-1; i >=0; i--)
            {
                for (int j = 0; j < HexDigits.Length-1; j++)
                {
                    if (HexArr[i] == HexDigits[j])
                    {
                        Dec += (int)(j * Math.Pow(16, power));
                    }
                }
                power++;
            }
            return Dec;
        }

        private void btnConvert_Click(object sender, EventArgs e)
        {
            txtDecimal.Text = HexToDecimal(txtHexadecimal.Text.ToUpper()).ToString();
        }

        private void btnReset_Click(object sender, EventArgs e)
        {
            txtDecimal.Clear();
            txtHexadecimal.Clear();
            txtHexadecimal.Focus();
        }
    }
} 
အေသးစိတ္နားလည္ႏိုင္ဖို႔အတြက္ က်ေနာ္ Trace လုိက္ျပပါ့မရ္။
Hex = 1AD, Dec=?
char[] HexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
'A', 'B', 'C', 'D', 'E', 'F'};
char[] HexArr = { '1', 'A', 'D'};

Loop1 =>  for (int i = HexArr.Length-1; i >=0; i--) =>
          for (int i = 2; i >=0; i--) => true
           for (int j = 0; j < HexDigits.Length-1; j++) => 
           for (int j = 0; j < 15; j++) => true
      if (HexArr[i] == HexDigits[j]) => 
             if (HexArr[2] == HexDigits[13]) => true
  Dec = (int)(13 * Math.Pow(16, 0)); => 13

Loop2 =>  for (int i = 1; i >=0; i--) => true
    for (int j = 0; j < 15; j++) => true
      if (HexArr[1] == HexDigits[10]) => true
  Dec = (int)(10 * Math.Pow(16, 1)); => 160 

Loop3 =>  for (int i = 0; i >=0; i--) => true
    for (int j = 0; j < 15; j++) => true
      if (HexArr[0] == HexDigits[1]) => true
  Dec += (int)(1 * Math.Pow(16, 2)); => 256 
Loop4 =>  for (int i = -1; i >=0; i--) => false
so, Dec = Loop1 + Loop2 + Loop3 = 13 + 160 + 156 = 429


ရွင္းလင္းခ်က္နဲ႔ Screen Shoot ေလးေတြကို ၾကည့္လိုက္ရင္ေတာ့ နားလည္သြားၾကလိမ့္မရ္လို႔ ထင္ပါတရ္ဗ်ာ။ မိတ္ေဆြ၊ ညီအစ္ကို၊ ေမာင္ႏွမတို႔အေနနဲ႔ Hexadecimal Number တစ္ခုကေနၿပီး Decimal Number တစ္ခုသို႔ ဘယ္လို ေျပာင္းလဲယူႏိုင္မလဲဆိုတာကို နားလည္သြားၾကမရ္လို႔ ထင္ပါတရ္ဗ်ာ။ စတင္ေလ့လာသူမ်ားအတြက္သာ ရည္ရြယ္လို႔ တင္ျပပံု မွားယြင္းတာ၊ အဓိပၸါယ္ ကြဲလြဲေဖာ္ျပမိတာရွိခဲ့ရင္ နားလည္ေပးၾကဖို႔ ေတာင္းပန္ပါတရ္ဗ်။ မိတ္ေဆြ၊ ညီအစ္ကို၊ ေမာင္ႏွမအားလံုး ေလ့လာျခင္းျဖင့္ ေက်နပ္ႏိုင္ၾကပါေစ။

0 Responses so far.

Post a Comment