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

이번 글에서는 C# byte 배열을 16진수 문자열을 로 변환하는 여러가지 방법에 대해 알아보도록 하겠습니다.

예를 들어 다음과 같은 byte 배열이 존재합니다.

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

이것을 16진수 문자열로 만들면

string hexString = “1A2B3C4D5E6F”;

이런 형식의 문자열이 됩니다.

이렇게 변환 하는 방법에 대해 알아보도록 하겠습니다.

먼저 16진수 Formatter 형식 지정자에 대해서 잠깐 알아보겠습니다.

16진수 포맷 지정자 X 및 x

16진수 포맷 지정자 X 또는 x는 숫자를 16진수 숫자들의 문자열로 변환합니다. 이 문자열은 대문자 또는 소문자로 표시될 수 있습니다.
16진수 포맷 변환을 위해 우리는 정밀도 지정자를 추가할 수 있습니다. 이 지정자는 결과 문자열에서 원하는 최소 숫자 자릿수를 나타냅니다. 필요한 경우, 숫자는 왼쪽에 0으로 패딩되어 정밀도 지정자가 나타내는 숫자 자릿수를 생성합니다.

16진수로 변환하는 ToString 메서드를 사용하여 그 예제를 보여드리겠습니다.

int n = 6702;

Console.WriteLine(n.ToString("X")); 
Console.WriteLine(n.ToString("x")); 
Console.WriteLine(n.ToString("X2"));
Console.WriteLine(n.ToString("X4"));
Console.WriteLine(n.ToString("X8"));

출력은 다음과 같습니다.

1A2E
1a2e
1A2E
1A2E
00001A2E

이를 통해 16진수 포맷 지정자 X와 x의 활용 및 정밀도 지정자의 역할에 대해 이해할 수 있습니다. 숫자를 원하는 형식으로 변환하는 유용한 방법 중 하나입니다.

이진 파일을 16진수 문자열로 변환하기

다음 예제는 아주 단순한 예제입니다. 그냥 파일을 byte[] 로 읽고 콘솔에 뿌려 주는 아주 간단한 예제입니다.

var path = "readme.txt";
byte[] data = File.ReadAllBytes(path);

int i = 0;

foreach (byte c in data)
{
    Console.Write("{0:X2} ", c);
    i++;

    if (i % 10 == 0)
    {
        Console.WriteLine();
    }
}

위 코드는 readme.txt 이진 파일을 읽어들입니다. 그리고 데이터는 16진수 형식으로 콘솔에 출력됩니다.

코드를 실행한 결과는 아래와 같습니다.

72 65 61 64 6D 65 2E 74 78 74
...

다음은 이 배열을 하나의 문자열로 변형하는 여러 가지 방법을 소개합니다.

LINQ

using System.Text;

string msg = "harostudio";
byte[] data = Encoding.ASCII.GetBytes(msg);

string hex = string.Join("",data.Select(x => x.ToString("X2")));
Console.WriteLine(hex);

위 코드는 “harostudio” 문자열을 byte배열로 먼저 변경한후 16진수 문자열로 변경합니다.
string.Join 은 문자열들을 합치는 기능이 있습니다.
byte[] 을 Linq 의 select 로 열거하여 string.Join으로 합치는 작업입니다.

그러면 결과 값은 다음과 같습니다.

6861726F73747564696F

Convert.ToHexString

using System.Text;

string msg = "harostudio";
byte[] data = Encoding.ASCII.GetBytes(msg);

string hex = Convert.ToHexString(data);
Console.WriteLine(hex);

위코드는 Convert.ToHexString 를 활용한 간단한 방법입니다.
아주 쉽게 바이트 배열을 16진수 문자열로 만들 수 있습니다.

결과 값은 역시 위의 값과 같습니다.

6861726F73747564696F

BitConverter.ToString

using System.Text;

string msg = "harostudio";
byte[] data = Encoding.ASCII.GetBytes(msg);

string hex = BitConverter.ToString(data);
Console.WriteLine(hex);

string hex2 = hex.Replace('-', ' ');
Console.WriteLine(hex2);

BitConverter.ToString 도 역시 byteArray 를 16진수 문자열로 변환합니다.
대신 이 변환 함수는 ToHexString 처럼 Hex 가 붙은 매서드가 아니라 ToString 자체가 16진수로 변환 됩니다.
또한 이 메서드는 1바이트씩 끊고 기본적으로 ‘-‘ 를 붙여서 표시됩니다.
불필요 하다면 string.Replace 로 지워줘야 합니다.

68-61-72-6F-73-74-75-64-69-6F
68 61 72 6F 73 74 75 64 69 6F

결론

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

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

Leave a Comment