2011-08-04 2 views
0

C++ 개발자는 많지 않으며 문자열을 처리하는 여러 방법으로 인해 항상 혼란 스럽습니다.void *를 CString으로 변환하는 방법

int Mine_SSL_Read(SSL* ssl, void* buf, int size) 
{ 
    int length = Real_SSL_Read(ssl, buf, size); 

    CString msg = ??? 
} 

그러나 나는 SSL_Read 기능 (OpenSSL을)에 대한 후크를 작성해야하고 어떤 C++ 코드가 필요합니다. 나는 void 타입 인 buf를 변환해야하고 CString에 "length"길이를 가지고 있으므로 다른 코드에서 파싱 할 수 있습니다. 당신은 reinterpret_cast를 사용하여 시도 할 수 있습니다

+2

'void *'의 예상 내용은 무엇입니까? 이것은 단지 ASCII 또는 UNICODE 문자의 버퍼입니까? 'NULL'이 종료 되었습니까? – Chad

+0

그것은 ASCII 문자이며 null로 끝납니다 (OpenSSL 문서가 끔찍한 것임을 알리는 한). 귀하의 솔루션이 두 가지 경우 모두를 처리 할 때 답변이 주어집니다. –

답변

2

단순히 1 바이트 (ASCII 또는 이와 유사한 것) 자입니다 : 당신이 NULL이 종료 알고 있다면

, 당신은 단순히 캐스팅 할 수 있습니다

// ASCII 
CString msg = reinterpret_cast<char*>(buf); 

// UNICODE 
CString msg = reinterpret_cast<wchar_t*>(buf); 

을가 NULL 종료되지 않으면 , 또는 그 사실을 알지 못한다면 바이트 단위로 복사해야합니다 (CStringassign 기능이 std :: string과 유사하다고 생각하지 않습니다).

CString msg; 

char* str_buf = msg.GetBuffer(); 
char* msg_buf = reinterpret_cast<char*>(buf); 

for(int x = 0; x < size; ++x) 
    *str_buf++ = *msg_buf++; 
1

,

CString msg = reinterpret_cast<wchar_t*>(buf); 
+1

이것은 건설적인 대답이 아닙니다. 그것은 입력 데이터의 포맷에 의존한다. 그것이 wcha_t * 일지라도, CString이 기대하는 방식으로 null-terminated 가능성은 무엇입니까? – tenfour

+1

@tenfour : 전에 OpenSSL을 사용했으며 char *입니다. 또한 null로 종료됩니다. –

+0

@ 코드 원숭이 : +1을주었습니다. 이 코드는 완성을 위해 작동하지만 Chad의 솔루션에 대한 답을주었습니다. –

0

은 무효 버프에 무엇에 따라 달라집니다. char * 간단한 캐스트 및 CString 생성자이면 충분합니다. 그렇지 않으면 wchar_t *를 char *로 변환해야합니다. 버퍼가 Null 종료되었는지 확인하십시오. void* 가정

관련 문제