从WCHAR转换为const unsigned char

时间:2020-07-27 20:26:33

标签: c++ wix

我是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的值是实时情况下的用户帐户密码,它将被传递给对密码值进行加密的方法。

2 个答案:

答案 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;
    
相关问题