2010-03-17 104 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())