C ++: Как преобразовать wstring с хэшем md5 в массив байтов *? - PullRequest
1 голос
/ 20 февраля 2012
std::wstring hashStr(L"4727b105cf792b2d8ad20424ed83658c");

//....

byte digest[16];

Как я могу получить хэш md5 в дайджесте?Мой ответ:

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));
}

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Вам нужно прочитать два символа из hashStr, преобразовать их из шестнадцатеричного в двоичное значение и поместить это значение в следующую точку в digest - что-то в этом порядке:

for (int i=0; i<16; i++) {
    std::wstring byte = hashStr.substr(i*2, 2);
    digest[i] = hextobin(byte);
}
0 голосов
/ 20 февраля 2012

C-way (я не тестировал его, но он должен работать (хотя я мог где-то облажаться), и вы все равно получите метод).

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)));
}
...