이번 글에서는 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();
}
활용 편
- 물리 주소(MAC Address) 를 바이트 배열로 변환해보자
string mac = "0A-5B-D6-F4-F5-06";
string macstr = mac.Replace("-","");
var bytevalue = HexStringToByteHex(macstr );
- 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진수 문자열로 변환하는 방법은 다음 글을 참조 하세요