2010-03-17 155 views
2

我需要將CString轉換爲BYTE數組。我不知道爲什麼,但我在網上發現一切都沒有工作:( 例如,我有無法將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包含海峽的只是第一個字母

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

是2

但是,如果使用常量字符串:

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

pbBuffer包含整個字符串

我的錯誤在哪裏?

回答

2

您的CString是Unicode(每個字符兩個字節),您試圖將其解釋爲ANSI(每個字符一個字節)。這導致你不期望的結果。

而不是將底層緩衝區投射到char*您需要轉換數據。爲此,使用WideCharToMultiByte()

1

您可能正在編譯unicode。這意味着你的CString包含wchar_t而不是char。將wchar_t指針轉換爲char指針會導致將第一個wchar_t的第二個字節解釋爲字符串終結符(因爲最常用字符的值爲0)

使用visual studio時,應始終使用_T()將字符串文字和TCHAR聲明爲您的字符類型。在你的情況下:

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

你得到的緩衝區,但其他字節最可能是零。

如果您需要ANSI字符串,請使用CStringA。 (但是在初始化時跳過_T())