繁体   English   中英

从 WCHAR 转换为 const unsigned char

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM