Я хочу напечатать MD5 для некоторой строки. Для этого я сделал функцию
std::string generateHashMD5(std::string text)
{
unsigned char * resultHash;
resultHash = MD5((const unsigned char*)text.c_str(), text.size(), NULL);
std::string result;
result += (char *) resultHash;
return result;
}
Я хочу напечатать результат этой функции. Я пытаюсь версию такой функции.
void printHash(std::string hash)
{
for (unsigned i = 0; i < str.size(); i++)
{
int val = (short) hash[i];
std::cout<<std::hex<<val<<':';
}
std::cout<<std::endl;
}std::string printHash(std::string hash)
{
char arrayResult[200];
for(int i = 0; i < 16; i++)
sprintf(&arrayResult[i*2], "%02x", (unsigned short int)hash[i]);
std::string result;
result += arrayResult;
return result;
}
Проблема в том, что, к сожалению, ни один из них не показывает правильный результат. Что нужно изменить в этой функции или где ошибки?
Вы неправильно используете std::string
в качестве буфера:
result += (char *) resultHash;
обрабатывает resultHash как c-строку, поэтому, если в середине есть байт \ 0, он не получит достаточно данных. Если байта \ 0 нет, вы скопируете слишком много и получите UB. Вы должны использовать конструктор с размером:
std::string result( static_cast<const char *>( resultHash ), blocksize );
где размер блока, вероятно, равен 16. Но я бы рекомендовал использовать std::array<uint8_t,blocksize>
или же std::vector<uint8_t>
вместо ОС std::string
, как std::string
для буфера очень сбивает с толку.
в случае, если MD5 возвращает байтовый массив
result += (char *) resultHash;
return result;
преобразование в строку потеряет числа после 0, потому что строковый конструктор интерпретирует ввод как строку с нулевым символом в конце
Таким образом, можно использовать вектор или строковую конструкцию с явным количеством символов.
Тем не менее, недостаточно информации, чтобы сказать точно