我需要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()初始化时,它)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top