我是wix应用程序包装商。我对C ++还是很陌生,并且遇到了以下问题。
在我的代码中,我试图将wchar
转换为const unsigned char
。我已经尝试了很多Internet上提供的解决方案,但我无法做到。
WCHAR szabc[888] = L"Example";
const unsigned char* pText = (const unsigned char*)szabc;
供您参考,szabc
的值是硬编码的,但理想情况下,它是在安装我的代码期间作为用户输入获取的。 szabc
需要转换为const unsigned char
,因为operator=
似乎无法转换。
我没有收到任何编译错误,但是当我运行此代码时,仅将szabc
的第一个字符分配给pText
,我希望将szabc
的整个值被分配给pText
。
由于pText
的值是实时情况下的用户帐户密码,它将被传递给对密码值进行加密的方法。
答案 0 :(得分:2)
由于您忽略了您的操作系统,因此我假设它是Windows。您需要WideCharToMultiByte或标准的wcstombs函数。
请注意,两者都会使用系统设置来确定目标编码,因此结果 在计算机之间会有所不同。如果可能,请转换为UTF-8或告诉您的用户不要使用特殊字符。
答案 1 :(得分:1)
operator=
无法将值分配给无关类型的变量。这就是为什么您不能直接将WCHAR[]
分配给unsigned char*
的原因。
但是,真正的问题是如何解释指向的数据。您有一个16位Unicode字符串,并且您正试图将其传递给明显希望使用以空值终止的8位字符串的方法。
在Windows上,WCHAR
是2个字节,因此Unicode字符串中的第二个 byte 是0x00
,例如:
WCHAR szabc[] = {L'E', L'x', L'a', L'm', L'p', L'l', L'e', L'\0'};
具有与此相同的内存布局:
BYTE szabc[] = {'E', 0x00, 'x', 0x00, 'a', 0x00, 'm', 0x00, 'p', 0x00, 'l', 0x00, 'e', 0x00, '\0', 0x00};
这就是为什么该方法仅显示1个“字符”的原因。遇到第一个0x00
字节时,它将停止读取。
因此,简单的指针类型转换是不够的。您将需要:
使用8位字符串开头,例如:
CHAR szabc[888] = "Example";
unsigned char* pText = (unsigned char*)szabc;
// use pText as needed...
转换在运行时使用WideCharToMultiByte()
或类似的方法,例如:
WCHAR szabc[888] = L"Example";
int len = WideCharToMultiByte(CP_ACP, 0, szabc, -1, NULL, 0, NULL, NULL);
CHAR szConverted = new char[len];
WideCharToMultiByte(CP_ACP, 0, szabc, -1, szConverted, len, NULL, NULL);
unsigned char* pText = (unsigned char*)szConverted;
// use pText as needed...
delete[] szConverted;