본문 바로가기
프로그래밍/C# (WinForms)

C#, WinForms ] decimal to hex / hex to decimal converter

by eteo 2023. 4. 12.

 

깃허브 주소 :

 

https://github.com/joeteo/num2hex

 

GitHub - joeteo/num2hex

Contribute to joeteo/num2hex development by creating an account on GitHub.

github.com

 

 

프로그램만 다운받기 :

num2hex.zip
0.01MB

 

 

 

 

 

 

 

 

 

 

먼저 디자이너에 대해 얘기해보면 comboBox는 사용자가 입력할 수 없게 DropDownStyle을 DropDownList로 만들었다. 그리고 콤보박스에서 선택된 항목이 변경되었을 때 호출되는 SelectedIndexChanged 이벤트 핸들러를 추가했다.

참고로 index는 처음 아무것도 선택하지 않았을 땐 -1이고 첫번째 아이템부터 인덱스 0으로 시작한다.

정수형 데이터 타입 선택 시 옆에 range를 보여주는 label은 AutoSize를 false로 해서 사이즈를 지정해둔 뒤 TextAlign을 MiddleCenter에 맞춘다.

 

 

 

private void comboBox_decimal_SelectedIndexChanged(object sender, EventArgs e)
{
    string selectedText = this.comboBox_decimal.SelectedItem.ToString();

    if (selectedText == "int8_t")
    {
        this.label_decimal_range.Text = "-128 ~ 127";
    }
    else if (selectedText == "uint8_t")
    {
        this.label_decimal_range.Text = "0 ~ 255";
    }
    else if (selectedText == "int16_t")
    {
        this.label_decimal_range.Text = "-32,768 ~ 32,767";
    }
    else if (selectedText == "uint16_t")
    {
        this.label_decimal_range.Text = "0 ~ 65,535";
    }
    else if (selectedText == "int32_t")
    {
        this.label_decimal_range.Text = "-2,147,483,648 ~ 2,147,483,647";
    }
    else if (selectedText == "uint32_t")
    {
        this.label_decimal_range.Text = "0 ~ 4,294,967,295";
    }
}

 

 

decimal to hex 변환

 

private void button3_Click(object sender, EventArgs e)
{
    if (this.textBox3_1.Text != "")
    {
        string selectedText = this.comboBox_decimal.SelectedItem.ToString();
        string inputString = this.textBox3_1.Text;
        bool parseResult = false;
        string hexString = "";

        if (selectedText == "int8_t")
        {
            if(parseResult = sbyte.TryParse(inputString, out sbyte val))
            {
                hexString = val.ToString("X2");
            }
        }
        else if (selectedText == "uint8_t")
        {
            if(parseResult = byte.TryParse(inputString, out byte val))
            {
                hexString = val.ToString("X2");
            }
        }
        else if (selectedText == "int16_t")
        {
            if(parseResult = short.TryParse(inputString, out short val))
            {
                hexString = val.ToString("X4");
            }
        }
        else if (selectedText == "uint16_t")
        {
            if(parseResult = ushort.TryParse(inputString, out ushort val))
            {
                hexString = val.ToString("X4");
            }
        }
        else if (selectedText == "int32_t")
        {
            if(parseResult = int.TryParse(inputString, out int val))
            {
                hexString = val.ToString("X8");
            }
        }
        else if (selectedText == "uint32_t")
        {
            if(parseResult = uint.TryParse(inputString, out uint val))
            {
                hexString = val.ToString("X8");
            }
        }

        if(this.radioButton_Little.Checked && (selectedText == "int16_t" || selectedText == "uint16_t"))
        {
            string tempString = hexString.Substring(2, 2) + hexString.Substring(0, 2);
            hexString = tempString;
        }
        else if(this.radioButton_Little.Checked && (selectedText == "int32_t" || selectedText == "uint32_t"))
        {
            string tempString = hexString.Substring(6, 2) + hexString.Substring(4, 2) + hexString.Substring(2, 2) + hexString.Substring(0, 2);
            hexString = tempString;
        }

        if(parseResult)
        {
            if (this.radioButton_0x.Checked)
            {
                this.textBox3_2.Text = "0x" + hexString.ToUpper();
            }
            else
            {
                string[] tokens = Enumerable.Range(0, hexString.Length / 2).Select(x => hexString.Substring(x * 2, 2)).ToArray();
                this.textBox3_2.Text = string.Join(" ", tokens);
            }
        }
        else
        {
            this.textBox3_2.Text = "ERROR";
        }

    }
}

 

이전과 크게 다르지 않다. 엔디안 스왑하는데 string 클래스의 Substring 메서드를 사용했다.

int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t 데이터 타입은 C#에서 sbyte, byte, short, ushort, int, uint와 대응된다.

 

 

 

hex to decimal 변환

 

private void button4_Click(object sender, EventArgs e)
{
    if (this.textBox4_1.Text != "")
    {
        string selectedText = this.comboBox_decimal.SelectedItem.ToString();
        string hexString = this.textBox4_1.Text;
        hexString = hexString.Replace("0x", "");
        hexString = hexString.Replace(" ", "");

        string maxStr = "";
        string regexStr = "";
        if(selectedText == "int8_t" || selectedText == "uint8_t")
        {
            maxStr = "2";
        }
        else if (selectedText == "int16_t" || selectedText == "uint16_t")
        {
            maxStr = "4";
        }
        else if (selectedText == "int32_t" || selectedText == "uint32_t")
        {
            maxStr = "8";
        }

        regexStr = "^[0-9a-fA-F]{1,"+maxStr+"}$";

        if (Regex.IsMatch(hexString, regexStr))
        {
            byte[] decimalBytes = Enumerable.Range(0, hexString.Length).Where(x => x % 2 == 0).Select(x => Convert.ToByte(hexString.Substring(x, 2), 16)).ToArray();
            if (this.radioButton_Big.Checked)
            {
                Array.Reverse(decimalBytes);
            }

            if (selectedText == "int8_t")
            {
                sbyte sbyteValue = (sbyte)decimalBytes[0];
                this.textBox4_2.Text = sbyteValue.ToString();
            }
            else if (selectedText == "uint8_t")
            {
                this.textBox4_2.Text = decimalBytes[0].ToString();
            }
            else if (selectedText == "int16_t")
            {
                short shortValue = BitConverter.ToInt16(decimalBytes, 0);
                this.textBox4_2.Text = shortValue.ToString();
            }
            else if (selectedText == "uint16_t")
            {
                ushort ushortValue = BitConverter.ToUInt16(decimalBytes, 0);
                this.textBox4_2.Text = ushortValue.ToString();
            }
            else if (selectedText == "int32_t")
            {
                int intValue = BitConverter.ToInt32(decimalBytes, 0);
                this.textBox4_2.Text = intValue.ToString();
            }
            else if (selectedText == "uint32_t")
            {
                uint uintValue = BitConverter.ToUInt32(decimalBytes, 0);
                this.textBox4_2.Text = uintValue.ToString();
            }
        }
        else
        {
            this.textBox4_2.Text = "ERROR";
        }

    }
}

 

BitConverter 클래스는 GetBytes() 메서드로 다양한 데이터 타입을 바이트 배열로 변환할 수 있고, 다시 바이트 배열을 다양한 데이터 타입으로 변환할 수 있다.

byte형은 변환이 필요 없고 sbyte는 캐스팅해서 사용했다.

 

 

 

배포하기

 

Properties를 클릭하면 배포에 필요한 설정과 빌드 설정을 할 수 있다.

Rebuild 를 클릭하면 Clean 후 Build를 누르는 것과 동일한 작업을 수행한다.

구성을 Release로 바꾼 경우 빌드-일괄빌드를 선택하거나 구성관리자에서 구성을 변경해 빌드를 수행하면 된다.

그리고 배포할 컴퓨터에 .NET Framework 가 설치되어 있어야 실행할 수 있으므로 디렉토리 내에 같이 배포하는 방법도 있다.