티스토리 뷰
시리얼 통신이나 인터넷을 비롯한 네트워크 기반으로 프로그램을 제작하다보면 송수신 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()를 사용하면 됩니다.
'프로그래밍' 카테고리의 다른 글
C# 데이터 타입과 값의 범위 (0) | 2018.02.08 |
---|---|
C#에서 엑셀 파일 읽고 쓰기 (2) | 2018.01.30 |
파일명에 있는 날짜의 시간대 바꾸기 (0) | 2017.07.07 |
QT 응용에서 PNG 로딩 경고 메시지 대처법 (0) | 2017.04.03 |
윈도우에서 QT 응용 개발 맛보기 (0) | 2017.03.24 |