🌈 프로그래밍/MFC

[ MFC, C++ ] BYTE to CString, CString to int 형변환

반응형

 

안녕하세요? 수구리입니다.

이번 포스팅에서는 C++에서 타입 변환과 관련된 글을 쓸려고 합니다.

BYTE라는 배열을 CString으로 변환 후 변환된 CString을 int로 변환하는 내용입니다.

 

우선 아래의 코드를 보시면..


BOOL CReviewControl::CheckRevolverLimit(int cam)
{
	BYTE byte[20] = { 0, };

	byte[0] = 'p';
	byte[1] = 'x';
	byte[2] = 0x0D;

	m_cRevolverPort[cam].clearPort();
	m_cRevolverPort[cam].sendBytes(byte, 3);
	
	BYTE rbuf[30] = { 0, };
	if (ReceiveRevolverPortData(cam, rbuf, 5, 2, COMM_WAIT_TIME) == 0)
	{
       		// BYTE [] to CString
		CString str_px((LPCSTR)&rbuf, sizeof(rbuf));
        	// CString to int
		int i_px = _ttoi(str_px);

		if (REVOL_LOW_LIMIT < i_px) {
			if (i_px < REVOL_HIGH_LIMIT) {
				return TRUE;
			} else {
				// HIGH LIMIT Detected!
				return FALSE;
			}
		} else {
			// LOW LIMIT Detected!
			return FALSE;
		}
	}
}

 

간단하게 위의 함수가 하는 일은

특정 Motor에게 PX라는 Command를 전송하고

응답을 받아와서 해당 값이 SW Limit 값에 위반되지 않는지에 대한 함수입니다.

만약 Limit이 감지되었다면 FALSE를 반환하고 아니라면 TRUE를 반환합니다.

정리하면 이 함수를 통해서 Motor의 위치값이 일정 범위 즉, Limit 내에 존재하냐를 Check 하는 함수입니다.

 

주석으로 처리된 부분을 보면..

// BYTE [] to CString
CString str_px((LPCSTR)&rbuf, sizeof(rbuf));

// CString to int
int i_px = _ttoi(str_px);

위의 부분이 설명하려고 하는 부분입니다.

이전에 rbuf라는 변수에는 Motor가 준 응답이 들어있으며 이는 BYTE 배열입니다.

따라서 응답받은 BYTE 배열을 rbuf의 크기만큼 CString으로 변환해주는 코드입니다.

 

이후에 SW Limit을 Check 하기 위해서는 정의되어있는 매크로 상수값과 비교를 해야하기 때문에

String 비교가 아니라 한번 더 형 변환을 통해서 int로 변환해주어야 합니다.

이는 _ttoi 함수를 사용하면 CString을 int로 형 변환을 할 수 있습니다.

 

이상으로 BYTE to CString & CString to int에 대한 포스팅을 마치겠습니다.

감사합니다.

 

 

반응형