2016-07-26 218 views
1

如何能/应该从unsigned char数组投射到一个widechar数组wchar_tstd::wstring?我怎样才能将它转换回unsigned char阵列?无符号字符数组到宽字符数组/字符串

或者OpenSSL可以从SHA256_Update产生一个widechar散列?

+1

你最后的陈述*几乎*显示了你实际上*试图做的事情。显然你正在尝试散列一些东西。是你想要散列宽字符数据?你是否试图将哈希API返回的八位字节转换为十六进制字符('0x010AA02BB'等等)?在* * *的情况下,我希望你至少能够理解,散列摘要的结果不可读为asci(或unicode)十六进制字符数据,除非通过某种转换来完成。它只是一个字节序列。 – WhozCraig

+0

@WhozCraig是的我想散列一个'std :: wstring',然后我想将它发布到我的服务器(所以转换回'std :: wstring'发布。哈希是我的身份验证令牌与服务器 –

+0

所以你在散列一个'std :: wstring'(假设你不*散列终止wchar),然后把结果散列转换为char 0..9的'std :: wstring', ..f(十六进制字符)发布,然后接收器然后将其转换回八位组来验证散列?是否描述了您的工作流程?如果是这样,其中一个(第一个)可能是可以避免的,这取决于服务器的散列例如,假设你已经有一个将原始八位字节转换为十六进制字符的“std :: wstring”的例程。 – WhozCraig

回答

2

尝试以下操作:

#include <cstdlib> 
using namespace std; 

unsigned char* temp; // pointer to initial data 
// memory allocation and filling 
// calculation of string length 

wchar_t* wData = new wchar_t[len+1]; 
mbstowcs(&wData[0], &temp1[0], len); 

Сoncerning逆铸造看的例子here或只是再次使用mbstowcs但与两个第一参数改变的地方。

另外WideCharToMultiByte function可以用于Windows开发,并且应该考虑设置区域设置(请参阅一些示例)。

UPDATE:

为了计算由unsigned char* temp指出串的长度以下方法可以用来:

const char* ccp = reinterpret_cast<const char*>(temp); 
size_t len = mbstowcs(nullptr, &ccp[0], 0); 
0
std::setlocale(LC_ALL, "en_US.utf8"); 
const char* mbstr = "hello"; 
std::mbstate_t state = std::mbstate_t(); 
// calc length 
int len = 1 + std::mbsrtowcs(nullptr, &mbstr, 0, &state); 
std::vector<wchar_t> wstr(len); 
std::mbsrtowcs(&wstr[0], &mbstr, wstr.size(), &state); 
0

如何能/ I应该从一个无符号字符阵列投到一个widechar数组wchar_t或std :: wstring?我怎样才能将它转换回unsigned char数组?

他们是完全不同的,所以你应该可以在大多数情况下这样做。如果你用真实的代码提供了一个具体的问题,那么我们可能会告诉你更多。


,或者可以OpenSSL的产生从SHA256_Update一个widechar哈希?

不,OpenSSL无法做到这一点。它产生的哈希是由字节组成的二进制字符串,而不是字符。您对演示详细信息负责,如窄/宽字符集或base64编码。