티스토리 뷰

프로그래밍

C# byte 배열의 타입 변환

야라바 2017. 8. 9. 16:25


시리얼 통신이나 인터넷을 비롯한 네트워크 기반으로 프로그램을 제작하다보면 송수신 API가 파라미터로 byte[] 배열을 요구하는 경우가 있습니다. 또는 응용 프로그램에서 바이트 단위로 읽거나 쓰는 버퍼링을 수행하거나 다양한 타입을 스트림(Stream)으로 송수신하는 경우에는 바이트 배열을 사용하는 경우가 많습니다. 이러한 경우 내부적으로 byte[] 배열과 다른 타입 간의 변환이 필요합니다. 


■ byte[] 배열을 다른 타입으로 변환

이 경우는 BitConverter.ToInt32(배열, 시작 위치)를 사용하면 편리합니다. 배열에 byte[] 배열의 이름을 기술하고 시작위치는 배열중에 어디를 시작 위치로 간주할 것인지를 지정합니다. 변환 대상 길이는 변환될 타입에 따라서 ToInt32면 4 바이트, ToInt16이면 2바이트와 같은 방식입니다. 아래와 같은 메소드를 사용할 수 있습니다.


    • ToBoolean(Byte[], Int32)

    • ToChar(Byte[], Int32)

    • ToDouble(Byte[], Int32)

    • ToInt16(Byte[], Int32)

    • ToInt32(Byte[], Int32)

    • ToInt64(Byte[], Int32)

    • ToSingle(Byte[], Int32)

    • ToUInt16(Byte[], Int32)

    • ToUInt32(Byte[], Int32)

    • ToUInt64(Byte[], Int32)


스트링(String) 타입에 대해서는 ToString(배열), ToString(배열, 시작위치), ToString(배열, 시작위치, 길이) 와 같이 시작 위치와 길이 파라미터를 조정할 수 있습니다. 문제는 BitConverter.ToString() 메소드를 사용하면 3가지 메소드 모두 "00-aa-cc" 처럼 16진 덤프를 리턴합니다. 일반적인 문자열을 원한다면 해당 문자열의 인코딩에 따라 변환해야 합니다.


Encoding.Default.GetString(배열); 

Encoding.Default.GetString(배열, 시작위치, 길이); 


위의 방법처럼 Encoding.Default.GetString()를 사용해도 되고 Encoding.UTF8.GetString() 이나 Encoding.ASCII.GetString()를 사용할 수도 있습니다. 한글이 포함되어 있다면 인코딩을 주의해야 합니다.


■ 다른 타입을 byte[] 배열로 변환

C#의 bool, char, long, int, float, double, short, ushort, uint, ulong 등의 스칼라 타입을 바이트 배열로 변환할 때는 BitConverter.GetBytes(변수)를 수행하면 바이트 배열을 리턴합니다.

문제는 스트링인데 방법은 바이트 배열을 스트링으로 변환할 때 처럼 인코딩을 감안해서 변환하는 것인데 Encoding.UTF8.GetBytes(), Encoding.ASCII.GetBytes(), Encoding.Default.GetBytes()를 사용하면 됩니다.




댓글
댓글쓰기 폼