본문 바로가기
C++ 200제/코딩 IT 정보

[형변환 Qt] QByteArray to Unsigned Char 형변환

by vicddory 2017. 9. 26.

[형변환 Qt] QByteArray to Unsigned Char 형변환


형변환은 어떤 언어를 다루건 필연적으로 개발자 앞에 나타난다.


어떤 언어든 (형변환이 일어나는) 퍼포먼스 향상을 위해 기본 라이브러리 보다 고정된 크기의 배열을 사용해야 하는 경우가 있다. Qt도 예외는 아닌지라 컨테이너 중 하나인 QByteArray를 char 배열로 형변환해야 할 상황이 존재한다.


QByteArray는 QSerialPort()나 QTcpSocket()을 이용해 패킷을 읽어 들인 후 반환하는 기본 자료형이다. 두 라이브러리 모두 connect()에서 readyRead() 시그널을 통해 패킷을 읽어 들인 후 형변환한다. QByteArray를 unsigned char로 형변환하는 코드는 이런 통신 환경에서 유용하게 사용할 수 있다.


본론으로 들어가 간단한 예제를 살펴본다.


1
2
3
4
5
6
7
//Header
#include <cstring>
 
using namespace std;
...
...
unsigned char packet_[5];
cs

위와 같이 cstring.h에 포함된 함수를 사용하기 위해 include를 선언한다. 이 예제에서 사용할 함수는 std::memcpy이다. (std::memcpy에 대해선 cppreference.com의 std::memcpy 항목을 참조)


아래 그림처럼 형변환에 필요한 cstring.h에 memcpy가 정의되어 있음이 확인된다.


QByteArray Char 형변환[[형변환 Qt] QByteArray to Unsigned Char 형변환]


그리고 unsigned char형 배열을 선언한다.


헤더에 포함할 소스의 양이 많지 않다.


1
2
3
4
5
6
7
//CPP
 
QByteArray &info;
... ... ... .. .. . .
std::memcpy(packet_, (unsigned char *)info.constData(), sizeof packet_);
 
std::memcpy(packet_, (unsigned char *)info.mid(05).data(), sizeof packet_);

c


memcpy 원형

void* memcpy( void* dest, const void* src, std::size_t count );


Qt 형변환 QByteArray[[형변환 Qt] QByteArray to Unsigned Char 형변환]


CPP에 포함된 구현부 소스


QByteArray 형태의 변수 info에 어떤 데이터가 삽입되었다고 가정하자. memcpy() 함수를 이용하기 위해선 3개의 인자도 필요하다.


1. 복사된 데이터를 담을 변수 (dest)

2. 데이터를 복사하여 넘겨줘야 할 변수 (src)

3. 복사될 크기 (size_t)


정말 간단하다. 헤더에 선언된 unsigned char* 형 변수를 넣어주면 그만이다.


3번 라인은 QByteArray에 담긴 데이터 크기가 5라는 것을 가정하고, 모든 데이터를 형변환한다.

5번 라인은 QByteArray에 담긴 데이터 중 5개만 형변환 후 복사한다.


QByteArray는 굵게 표시한 부분처럼, constData() 함수와 data() 함수 등을 제공하는데, 지금처럼 unsigned char 형으로 형변환하는 경우엔 두 함수 모두 사용할 수 있다.


자료 형변환 Qt[[형변환 Qt] QByteArray to Unsigned Char 형변환]


상수화(const)를 하건, 상수화를 하지 않건, 상황에 따라 다르니 그때그때 맞춰가며 사용하는 것이 현명한 선택이다.

자료형을 형변환하는 컨버팅 과정엔 많은 수단이 존재할 테니, 더욱 좋은 방법이 있다면 그것을 취하도록 하자.


[형변환 Qt] QByteArray to Unsigned Char 형변환

댓글