Проблема в том, что, с одной стороны, QString
игнорирует \0
как строку завершения, с другой стороны, QByteArray
всегда добавляет дополнительные \0
. Из документации Qt:
Использование QByteArray намного удобнее, чем использование const char *
. За кулисами он всегда гарантирует, что за данными следует терминатор \0
, и использует неявное совместное использование (копирование при записи), чтобы уменьшить использование памяти и избежать ненужного копирования данных.
https://doc.qt.io/qt-5/qbytearray.html
Итак, каждый addData
в вашем случае добавляет дополнительный \0
к данным, которые должны быть хешированы. Некоторым обходным решением может быть следующий код:
QFile file(path);
if( file.open(QFile::ReadOnly ) )
{
QCryptographicHash hash(QCryptographicHash::Sha1);
QByteArray header = QString("blob %1").arg(file.size()).toUtf8();
hash.addData(header.data(), header.size() + 1);
hash.addData(file.readAll());
shaFile = hash.result().toHex();
qDebug() << shaFile;
}
data()
из QByteArray
- это , возвращающий указатель на данные, хранящиеся в массиве байтов. Указатель можно использовать для доступа и изменения байтов, составляющих массив. Данные заканчиваются символом '\ 0', т.е. количество байтов в возвращаемой символьной строке равно size () + 1 для терминатора '\ 0'. Следовательно, нам не нужно явно добавлять \0
, QByteArray
делает это за нас. Нам нужно добавить +1
к размеру, поскольку QByteArray
возвращает размер массива, поскольку это не будет символ \0
.
Приведенный выше код сгенерировал ccbf4f0a52fd5ac59e18448ebadf2ef37c62f54f
для вашего файла, поэтому я предполагаю, что это это правильный га sh.