깃허브 주소 :
https://github.com/joeteo/num2hex
프로그램만 다운받기 :
먼저 디자이너에 대해 얘기해보면 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 가 설치되어 있어야 실행할 수 있으므로 디렉토리 내에 같이 배포하는 방법도 있다.
'프로그래밍 > C# (WinForms)' 카테고리의 다른 글
[C#] 현재 .NET SDK에서는 .NET 6.0을(를) 대상으로 하는 것을 지원하지 않습니다. (0) | 2023.05.14 |
---|---|
WinForms ] ImageList와 ColorDepth 속성 (0) | 2023.05.07 |
C#, WinForms ] float to hex / hex to float Converter (0) | 2023.04.09 |
C#, LINQ ] Enumerable 클래스, Range(), Select(), Where(), ToArray() 메서드 (0) | 2023.04.09 |
WinForms ] Label vs TextBox 컨트롤 (0) | 2023.04.09 |