题
我需要CString的转换为字节数组。我不知道为什么,但我在网上发现一切都没有工作:( 例如,我有
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
但是,如果使用常量字符串:
BYTE *pbBuffer = (BYTE*)"string";
<强> pbBuffer 强>包含整个字符串
在哪里是我的错?
解决方案
您CString的是Unicode(每个字符用两个字节),并尝试将其解释为ANSI(每个字符一个字节)。这导致你不期望的结果。
代替浇铸底层缓冲区进入char*
的需要将数据转换。使用调用WideCharToMultiByte()获得这一点。
其他提示
您可能正在使用Unicode编译。这意味着您的CString包含wchar_t的字符来代替的。一个wchar_t的指针转换为字符指针使你解释所述第一wchar_t的作为字符串终止子的第二个字节(因为这是由0为最常用的字符)
在使用Visual Studio的你应该总是使用_T()来声明字符串和TCHAR为你的性格类型。在你的情况:
BYTE* pBuffer = (BYTE*)(LPCTSTR)str;
您得到缓冲,但每隔一个字节是最有可能为零。
如果您需要一个ANSI字符串使用CStringA。 (但是,然后跳过_T()初始化时,它)
不隶属于 StackOverflow