2015-10-18 2 views
1

У меня есть код, который генерирует md5 для строк. Теперь я хочу добавить поколение md5 для файлов. Работает с txt-файлами (xml, html, txt и т. Д.), Но когда я пытаюсь сделать это с двоичным файлом (zip, bin, apk и т. Д.), Я вижу неправильный результат. Как я могу правильно прочитать файл bin в (char *), чтобы генерировать допустимый хеш?Как сгенерировать md5 файла в Qt?

Я пытался использовать TextStream, но результат не является действительным

QFile file(fileName); 
file.open(QIODevice::ReadOnly); 

QTextStream in(&file); 
QString t = in.readAll(); 
file.close(); 

string res = md5(t.toStdString()); 

Также я пытался использовать QByteArray и после этого новообращенного ByteArray, чтобы обугливается * Но это не правильно работать тоже. Как я могу это исправить?

+0

* Никогда не используйте 'QString' и' QTextStream' для двоичных данных *. Они предназначены для текста Unicode, декодированного из байтов в хорошо известной кодировке. Попытка использовать их для двоичных данных будет с удовольствием и без задержек. –

+0

Хорошо, но что я могу использовать для этого? – Pein

+0

Возможно, вы захотите рассмотреть QCrytographicHash. Qt имеет встроенную генерацию md5. http://doc.qt.io/qt-5/qcryptographichash.html – drescherjm

ответ

5

Никогда не используйте QString и QTextStream для двоичных данных. Они предназначены для текста в Юникоде, декодированного из байтов в хорошо известной кодировке. Попытка использовать их для двоичных данных будет радостно и беззвучно прикручивать его, так как QString по умолчанию попытается интерпретировать входные данные, используя некоторую кодировку, чтобы перевести ее в хранилище UTF-16, тихо пропустив все, что не может понять.

Класс для хранения двоичных данных: QByteArray, и вы можете прочитать весь файл в нем с помощью метода QFile::read().

QByteArray data; 
{ 
    QFile file(fileName); 
    file.open(QIODevice::ReadOnly); 
    data.readAll(); 
} 

string res = md5(std::string(data.begin(), data.end()); 

Обратите внимание, что я построил std::string с конструктором диапазона на основе, так как только с помощью std::string(data.data()) (конструктор из строки C) остановится на первой вложенной NUL.

+0

Я попытался использовать QByteArray, но я тоже ошибся :( Итак, я думаю, что это проблема с моей реализацией md5. Но для строк и txt-файлы, которые он работает – Pein

+0

Давайте посмотрим ваш код ... вы можете ошибаться в 'QByteArray', если вы не делаете то, что я сделал (например, вы не создаете' std :: string' с диапазоном- основанный конструктор). –

+0

О, извините, ваш код работает, спасибо) – Pein

Смежные вопросы