C# 16진수 문자열을 BYTE[] 로 변환하는 여러가지 방법

이번 글에서는 C# 16진수 문자열을 BYTE[] 로 변환하는 여러가지 방법에 대해 알아보도록 하겠습니다. 16진수는 0부터 9까지의 숫자와 A부터 F까지의 문자로 이루어진 문자열을 의미합니다.
BYTE[]는 메모리에 이진 데이터로 저장되는 형태입니다. 이를 변환해 보도록 하겠습니다.

예를 들어보면 다음 문자열이 존재합니다.

string hexString = “1A2B3C4D5E6F”;

이것을 byte[] 형식으로 변경하면 결과는 다음과 같을것입니다.

byte[] bytevalue = {0x1A, 0x2B, 0x03C, 0x4D, 0x5E, 0x6F };

이를 행하기 위한 중요 변환 함수는 다음과 같습니다.

System.Convert.ToByte()

이함수는 지정된 string 을 8비트 부호 없는 정수로 변환합니다. 그런데 byte 로 변환할수 있는 string의 길이는 해당 정수로 했을때 최대길이는 3입니다.
즉 정수기준 “255” 이상은 byte에 담지 못하니 긴 16진수 문자열은 이 함수 한번만으로는 배열에 담지 못합니다. 그래서 2자리씩 끊어서 넣어야 합니다.

변경하는 예제소스를 다음과 같습니다.

예제 소스

for문을 이용한 순환 변환

public byte[] HexStringToByteHex(string strHex)
{
    byte[] bytes = new byte[strHex.Length / 2];

    for (int count = 0; count < strHex.Length; count += 2)
    {
        bytes[count / 2] = System.Convert.ToByte(strHex.Substring(count, 2), 16);
    }
    return bytes;
}

Linq , Lamda 를 활용한 간편 변환

public byte[] HexStringToByteHex(string strHex)
{
	return Enumerable.Range(0, strHex.Length)
		.Where(x => x % 2 == 0)
		.Select(x => System.Convert.ToByte(strHex.Substring(x, 2), 16))
		.ToArray();
}

활용 편

  1. 물리 주소(MAC Address) 를 바이트 배열로 변환해보자
string mac = "0A-5B-D6-F4-F5-06";
string macstr = mac.Replace("-","");
var bytevalue = HexStringToByteHex(macstr );
  1. IPV6 문자열을 byte[] 배열로 변경해 보자
string ipv6 = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";
string ipv6str = ipv6.Replace(":","");
var bytevalue = HexStringToByteHex(ipv6str);

IPV6 를 byte[] 로 변환하는 방법은 다른 좋은 방법들이 있습니다. 위 예제는 그냥 예제일뿐입니다.

결론

이번 글에서는 C# 16진수 문자열을 BYTE[] 로 변환하는 간단한 방법에 대해서 알아보았습니다.

반대로 C# byte 배열을 16진수 문자열로 변환하는 방법은 다음 글을 참조 하세요

Leave a Comment