C++ C++;:如何将带有md5哈希的wstring转换为字节*数组?
如何在摘要中获取md5哈希? 我的答案是:C++ C++;:如何将带有md5哈希的wstring转换为字节*数组?,c++,hash,wstring,C++,Hash,Wstring,如何在摘要中获取md5哈希? 我的答案是: std::wstring hashStr(L"4727b105cf792b2d8ad20424ed83658c"); //.... byte digest[16]; wchar\u t*EndPtr; 对于(int i=0;i
std::wstring hashStr(L"4727b105cf792b2d8ad20424ed83658c");
//....
byte digest[16];
wchar\u t*EndPtr;
对于(int i=0;i<16;i++){
std::wstring bt=hashStr.substr(i*2,2);
摘要[i]=静态演播(wcstoul(bt.c_str(),&EndPtr,16));
}
您需要从hashStr
中读取两个字符,将它们从十六进制转换为二进制值,然后将该值放入摘要中的下一个点中--
wchar_t * EndPtr;
for (int i = 0; i < 16; i++) {
std::wstring bt = hashStr.substr(i*2, 2);
digest[i] = static_cast<BYTE>(wcstoul(bt.c_str(), &EndPtr, 16));
}
对于(int i=0;i您需要从hashStr
中读取两个字符,将它们从十六进制值转换为二进制值,并将该值放入摘要中的下一个位置--
wchar_t * EndPtr;
for (int i = 0; i < 16; i++) {
std::wstring bt = hashStr.substr(i*2, 2);
digest[i] = static_cast<BYTE>(wcstoul(bt.c_str(), &EndPtr, 16));
}
for(inti=0;iC-way)(我没有测试它,但它应该可以工作(尽管我可能在某个地方搞砸了),而且你无论如何都会得到这个方法)
memset(摘要,0,sizeof(摘要));
对于(int i=0;i<32;i++)
{
wchar_t numwc=hashStr[i];
字节numbt;
如果(numwc>=L'0'&&numwcC-way(我没有测试它,但它应该可以工作(尽管我可能在某个地方搞砸了),那么无论如何你都会得到这个方法)
memset(摘要,0,sizeof(摘要));
对于(int i=0;i<32;i++)
{
wchar_t numwc=hashStr[i];
字节numbt;
如果(numwc>=L'0'&&numwc,它是一个字节
数组,而不是字节*
数组,它对于该字符串来说太小了。@jrok:摘要
足够大;32个十六进制字符是16个字节。我需要摘要[0]==0x8c,摘要[1]==0x65,…这里的答案很好:@ildjarn我缺少什么?hashStr.length()
是32,对吗?这是一个字节数组,而不是字节*
数组,它对于那个字符串来说太小了。@jrok:摘要
足够大;32个十六进制字符是16个字节。我需要摘要[0]==0x8c,摘要[1]==0x65,…这里的答案很好:@ildjarn我在这里缺少什么?hashStr.length()
是32,对吗?
memset(digest, 0, sizeof(digest));
for (int i = 0; i < 32; i++)
{
wchar_t numwc = hashStr[i];
BYTE numbt;
if (numwc >= L'0' && numwc <= L'9') //I assume that the string is right (i.e.: no SGJSGH chars and stuff) and is in uppercase (you can change that though)
{
numbt = (BYTE)(numwc - L'0');
}
else
{
numbt = 0xA + (BYTE)(numwc - L'A');
}
digest[i/2] += numbt*(2<<(4*((i+1)%2)));
}