2

CStringをBYTE配列に変換する必要があります。理由はわかりませんが、インターネットで見つけたものはすべて機能しません:(たとえば、私は

CString str = _T("string");

私はそうしようとしてきました1)

BYTE *pbBuffer = (BYTE*)(LPCTSTR)str;

2)

BYTE *pbBuffer = new BYTE[str.GetLength()+1];
memcpy(pbBuffer, (VOID*)(LPCTSTR)StrRegID, str.GetLength());

3)

BYTE *pbBuffer = (BYTE*)str.GetString();

そして常にpbBufferにはstrの最初の文字だけが含まれています

DWORD dwBufferLen = strlen((char *)pbBuffer)+1;

は2です

しかし、const stringを使用する場合:

BYTE *pbBuffer = (BYTE*)"string";

pbBufferには文字列全体が含まれています

私の間違いはどこにありますか?

4

2 に答える 2

2

CStringはUnicode(1文字あたり2バイト)であり、ANSI(1文字あたり1バイト)として解釈しようとします。これはあなたが期待しない結果につながります。

基になるバッファをキャストする代わりにchar*、データを変換する必要があります。そのためにWideCharToMultiByte()を使用します。

于 2010-03-17T07:49:29.490 に答える
1

おそらくUnicodeでコンパイルしています。これは、CStringにcharではなくwchar_tが含まれていることを意味します。wchar_tポインタをcharポインタに変換すると、最初のwchar_tの2番目のバイトが文字列ターミネータとして解釈されます(最も一般的な文字のbyは0であるため)

Visual Studioを使用する場合は、常に_T()を使用して文字列リテラルを宣言し、文字タイプとしてTCHARを宣言する必要があります。あなたの場合:

BYTE * pBuffer =(BYTE *)(LPCTSTR)str;

バッファを取得しますが、1バイトおきにゼロになる可能性があります。

ANSI文字列が必要な場合は、CStringAを使用してください。(ただし、初期化するときは_T()をスキップしてください)

于 2010-03-17T07:57:14.240 に答える