将'const wchar_t *'转换为'unsigned char *'

时间:2011-10-02 02:49:38

标签: c++ winapi unicode

在C ++中是否可以将'const wchar_t *'转换为'unsigned char *'?

我该怎么做?

wstring dirName;
unsigned char* dirNameA = (unsigned char*)dirName.c_str();

// I am creating a hash from a string
hmac_sha256_init( hash, (unsigned char*)dirName.c_str(), (dirName.length)+1 );

3 个答案:

答案 0 :(得分:1)

尝试使用reinterpret_cast。所以:

unsigned char * dirNameA = reinterpret_cast<unsigned char *>(dirName.c_str());

这可能不起作用,因为c_str返回一个const wchar_t *,所以你也可以尝试:

unsigned char * dirNameA = reinterpret_cast<unsigned char *>(
                               const_cast<wchar_t *>(dirName.c_str())
                           );

这是有效的,因为hmac_sha256_init应接受二进制blob作为其输入,因此dirName中包含的unicode字符串是可接受的散列输入。

但是你的代码中有一个错误 - dirName.length()返回的长度是字符数,而不是字节数。这意味着由于您将unicode字符串作为二进制blob传递,因此将少量字节传递给hmac_sha256_init,因此需要将(dirName.length())乘以2.

答案 1 :(得分:1)

您需要逐个字符转换。有wcstombs这样的函数可以做到这一点。

答案 2 :(得分:1)

由于您使用的是WinAPI,请使用WideCharToMultiByte