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 字符串:

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

pbBuffer包含整个字符串

我的错误在哪里?

4

2 回答 2

2

您的 CString 是 Unicode(每个字符两个字节),您尝试将其解释为 ANSI(每个字符一个字节)。这会导致您意想不到的结果。

无需将底层缓冲区转换为char*您需要转换数据。为此使用WideCharToMultiByte()

于 2010-03-17T07:49:29.490 回答
1

您可能正在使用 unicode 进行编译。这意味着您的 CString 包含 wchar_t 而不是 char。将 wchar_t 指针转换为 char 指针会使您将第一个 wchar_t 的第二个字节解释为字符串终止符(因为对于最常见的字符而言,by 为 0)

使用 Visual Studio 时,您应该始终使用 _T() 将字符串文字和 TCHAR 声明为您的字符类型。在你的情况下:

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

你得到了缓冲区,但每隔一个字节很可能为零。

如果需要 ANSI 字符串,请使用 CStringA。(但在初始化时跳过 _T() )

于 2010-03-17T07:57:14.240 回答