2011-08-04 26 views
0

C++開発者の多くではなく、文字列を処理する方法が複数あるので、私は常に混乱します。void *をCStringに変換する方法

しかし、私はSSL_Read関数(OpenSSL)のフックを書く必要があり、これにはC++コードが必要です。私はvoid *型の長さを持つbufをCStringに変換する必要があるので、他のコードで解析することができます。

+2

「void *」の予想される内容は何ですか?これは単に 'ASCII'または' UNICODE'文字のバッファですか? 'NULL'は終了していますか? – Chad

+0

これはASCII文字で、ヌルで終わっています(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

あなたはそれが無効バフに何があるかに依存し、reinterpret_castを使用して

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

これは建設的な答えではありません。入力データの形式に依存します。たとえそれがwcha_t *であっても、CStringが期待する方法でヌル終了する可能性は何ですか? – tenfour

+1

@tenfour:以前はOpenSSLを使用していましたが、char *であり、nullで終了しています。 –

+0

@コードモンキー:+1してください。コードは完全性のために機能しますが、私はチャドの解答に答えました。 –

0

を試すことができます。 char *の場合は単純なキャストとCStringのコンストラクタで十分です。それ以外の場合は、wchar_t *をchar *に変換する必要があります。バッファがヌル終端されていることを確認してください。 void*を想定し

関連する問題