[英]Conversion from WCHAR to const unsigned char
我是 wix 应用程序打包者。 我对 C++ 很陌生,我被以下问题困扰。
在我的代码中,我试图将wchar
转换为const unsigned char
。 我已经尝试了很多我在互联网上获得的解决方案,但我无法做到。
WCHAR szabc[888] = L"Example";
const unsigned char* pText = (const unsigned char*)szabc;
供您参考, szabc
的值是硬编码的,但理想情况下,它是在安装我的代码期间作为用户输入获取的。 szabc
需要转换为const unsigned char
因为operator=
似乎不适用于转换。
我没有收到任何编译错误,但是当我运行此代码时,仅将szabc
的第一个字符分配给pText
,我希望将szabc
的整个值分配给pText
。
由于pText
的值是实时场景中的用户帐户密码,它会被传递给对密码值进行加密的方法。
由于您忽略了提及您的操作系统,我假设它是 Windows。 您需要WideCharToMultiByte或标准wcstombs函数。
请注意,两者都将使用系统设置确定目标编码,因此结果会因计算机而异。 如果可能,请转换为 UTF-8 或告诉您的用户远离特殊字符。
operator=
不能为不相关类型的变量赋值。 这就是为什么您不能将WCHAR[]
直接分配给unsigned char*
的原因。
然而,真正的问题在于如何解释指向的数据。 您有一个 16 位 Unicode 字符串,并且您正试图将它传递给一个明显需要以空字符结尾的 8 位字符串的方法。
在 Windows 上, WCHAR
是 2 个字节,因此 Unicode 字符串中的第二个字节是0x00
,例如:
WCHAR szabc[] = {L'E', L'x', L'a', L'm', L'p', L'l', L'e', L'\0'};
具有与此相同的 memory 布局:
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()
或等效方法在运行时转换Unicode 数据,例如:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.