C#에서 Byte[]와 String간 변환하기
서버에서 받은 데이터를 byte[]에 문자열로 저장하고 MessageBox.Show()로 보여주려고 했더니 System.Byte[]만 계속 찍혔다. 배열을 그대로 출력하면 ToString()이 타입 이름만 돌려주기 때문이다. 명시적으로 인코딩을 지정해 변환해야 한다.
string을 byte[]로 변환하려면:
byte[] ba = System.Text.Encoding.Default.GetBytes( str );
byte[]를 string으로 변환하려면:
string str = System.Text.Encoding.Default.GetString( ba );
2026년 수정 안내 원래 이 글은
Encoding.Default를 그대로 쓰라고만 적혀 있었다. 그런데 이 값이 .NET Framework와 .NET Core/5+에서 서로 다른 인코딩을 가리킨다. 서버와 데이터를 주고받는 코드라면 위험한 함정이라 바로잡는다.
Encoding.Default는 실행 환경에 따라 달라진다
- .NET Framework — 운영체제의 시스템 ANSI 코드페이지를 가리킨다. 한국어 윈도우라면 CP949(EUC-KR 확장).
- .NET Core / .NET 5 이상 — 플랫폼 독립성을 위해 항상 UTF-8을 가리킨다.
즉 같은 코드를 .NET Framework에서 돌릴 때와 .NET 5+에서 돌릴 때 결과가 달라진다. 서버가 CP949로 인코딩해 보낸 패킷을 .NET 5+ 클라이언트가 Encoding.Default로 받으면 한글이 깨진다.
인코딩을 명시적으로 지정한다
서버와 통신하는 코드라면 프로토콜이 어떤 인코딩을 쓰는지 정해두고 그것을 명시적으로 지정해야 한다. Default에 기대면 안 된다.
// 프로토콜이 UTF-8이라고 정했다면
byte[] ba = Encoding.UTF8.GetBytes( str );
string str2 = Encoding.UTF8.GetString( ba );
// 레거시 한글 프로토콜(CP949/EUC-KR)과 맞춰야 한다면
// .NET Core/5+에서는 System.Text.Encoding.CodePages 패키지와
// Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) 등록이 먼저 필요하다
byte[] baKr = Encoding.GetEncoding( 949 ).GetBytes( str );
새로 만드는 프로토콜이라면 플랫폼과 언어를 가리지 않고 통용되는 UTF-8로 통일하는 것이 가장 무난하다.
댓글 남기기