Дайджест MD5 усекается при представлении в виде QString

Я занимаюсь разработкой приложения Qt на 64-битной ОС Windows 8. Я столкнулся с этим странным случаем, когда дайджест сообщения MD5 составляет всего 4 символа (= 32 бита). За исключением этого исключительного ввода, я получаю 16-разрядную (= 128-битную) строку дайджеста сообщения.

Дайджест сообщения MD5 должен быть фиксированной длины

MD5- Википедия

мой фрагмент кода

qDebug()<<"Case 1:=> ";

message1="HYQPTPORKTWKJSVIVXHS1.130hello world!";
input.append(message1);
output=QCryptographicHash::hash(input,QCryptographicHash::Md5);
QString digest1(QString(output).toAscii());
qDebug()<<"md5  string: "<<digest1;
qDebug()<<"length :"<<digest1.length();

qDebug()<<"Case 2:=>";
input=""; // clears previous input
message2="HYQPTPORKTWKJSVIVXHS1.131hello world!";  // put anything else than message1
input.append(message2);
output=QCryptographicHash::hash(input,QCryptographicHash::Md5);
QString digest2(QString(output).toAscii());
qDebug()<<"md5  string: "<<digest2;
qDebug()<<"length :"<<digest2.length();

Выход

 Case 1:=>
md5  string:  ")QÄ"length : 4 // here I'm expecting 16
Case 2:=>
md5  string:  "X,öéö< Ú4Îu"length : 16

Я делаю что-то неправильно?

0

Решение

Вы интерпретируете 128-бит двоичный MD5 как ASCII. Если у вас есть один байт (восемь битов) со значением «0» в ASCII на C ++, это считается маркером «конца строки».

Вы должны представлять MD5 как шестнадцатеричный в ASCII, а не пытаться читать его как есть в ASCII.

Я не делаю Qt, но быстрый поиск говорит, что что-то вроде этого сделает то, что вы хотите:

QString digest2(output.toHex()));

Вы должны всегда быть уверены (особенно когда имеешь дело с такими языками, как C ++), что вы полностью осведомлены о том, что на самом деле происходит под капотом, и в данном конкретном случае, каков фактический тип данных всех ваших операций. Все это просто байты в памяти, и C ++ дает вам возможность «читать» эти байты как угодно, даже если они не готовы или предназначены для этого.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]