我需要将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 包含整个字符串
我的错误在哪里?
答案 0 :(得分:2)
您的CString是Unicode(每个字符两个字节),您尝试将其解释为ANSI(每个字符一个字节)。这会导致您不期望的结果。
您需要转换数据,而不是将基础缓冲区转换为char*
。请使用WideCharToMultiByte()。
答案 1 :(得分:1)
您可能正在使用unicode进行编译。这意味着您的CString包含wchar_t而不是char。将wchar_t指针转换为char指针会导致您将第一个wchar_t的第二个字节解释为字符串终止符(因为对于最常见的字符,它是0)
使用visual studio时,应始终使用_T()声明字符串文字,将TCHAR声明为字符类型。在你的情况下:
BYTE* pBuffer = (BYTE*)(LPCTSTR)str;
你得到缓冲区,但每隔一个字节很可能为零。
如果需要ANSI字符串,请使用CStringA。 (但是在初始化时跳过_T())