• 19096阅读
  • 19回复

[提问]qt 怎样获取文件的MD5? [复制链接]

上一主题 下一主题
离线zzxap
 

只看楼主 倒序阅读 楼主  发表于: 2011-03-30
qt 怎样获取文件的MD5?
stream.readAll();
再计算这个流的md5 得到的MD5不正确。

[ 此帖被zzxap在2011-03-30 18:15重新编辑 ]
离线wxj120bw

只看该作者 1楼 发表于: 2011-03-31
引用楼主zzxap于2011-03-30 18:15发表的 qt 怎样获取文件的MD5? :
qt 怎样获取文件的MD5?
stream.readAll();
再计算这个流的md5 得到的MD5不正确。


有个帖子 楼主自己分析下有没有帮助 http://stackoverflow.com/questions/1220046/in-c-how-to-get-md5-hash-of-a-file
离线dbzhang800

只看该作者 2楼 发表于: 2011-03-31
引用楼主zzxap于2011-03-30 18:15发表的 qt 怎样获取文件的MD5? :
qt 怎样获取文件的MD5?
stream.readAll();
再计算这个流的md5 得到的MD5不正确。


这种情况下,你不妨贴你的测试代码。用Qt实现这个功能的完整的测试代码应该不超过15行。
离线dbzhang800

只看该作者 3楼 发表于: 2011-03-31
引用第1楼wxj120bw于2011-03-31 01:48发表的  :
有个帖子 楼主自己分析下有没有帮助 http://stackoverflow.com/questions/1220046/in-c-how-to-get-md5-hash-of-a-file


这个链接中对Qt有用的其实就是 ,akira 在评论中给的一句话。不过熟悉Qt自带的类还是王道,现成的东西直接用就好了
离线zzxap

只看该作者 4楼 发表于: 2011-03-31
QString GetKeyPath::GetFileMd5(QString FilePath)
{//获取文件的md5

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    QTextCodec *code=QTextCodec::codecForName("utf8");//本人采用的是UTF8格式显示的
    QFile file(FilePath);
    QString macmd5 = "";
    if(file.exists(FilePath))
    {
    file.open(QIODevice::ReadOnly);
    QTextStream stream(&file);
    stream.setCodec(code);//输出流的设置
    QString txt="";
    txt=stream.readAll();
    QByteArray byte;
    byte = txt.toAscii();
    macmd5=QCryptographicHash::hash(byte,QCryptographicHash::Md5).toHex().constData();
}
    return macmd5;
}
离线zzxap

只看该作者 5楼 发表于: 2011-03-31
不要用openssl 和sha。用qt自带的类
离线zzxap

只看该作者 6楼 发表于: 2011-03-31
为什么要贴完整代码
stream.readAll();
再计算这个流的md5 得到的MD5不正确。
这已经说的很清楚,除非你不熟悉QT
离线dbzhang800

只看该作者 7楼 发表于: 2011-03-31
引用第4楼zzxap于2011-03-31 09:01发表的  :
QString GetKeyPath::GetFileMd5(QString FilePath)
{//获取文件的md5
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    QTextCodec *code=QTextCodec::codecForName("utf8");//本人采用的是UTF8格式显示的
.......

如果没有其他理由的话,直接用QFile读入到QByteArray,然后直接计算Md5,去掉所有和 QTextStream以及编码有关的部分
离线dbzhang800

只看该作者 8楼 发表于: 2011-03-31
引用第6楼zzxap于2011-03-31 09:08发表的  :
为什么要贴完整代码
stream.readAll();
再计算这个流的md5 得到的MD5不正确。
这已经说的很清楚,除非你不熟悉QT

没有其他代码,别人如何确定你的stream是正确的,更何况,连stream是什么都不知道。而你贴出代码后,明显看你进行了一次先解码后编码的动作,为何要这么做呢?
离线linxy

只看该作者 9楼 发表于: 2011-03-31
    QFile file( ":/md5.txt" );
    if ( file.open(QIODevice::ReadOnly) )
    {
        qDebug( ) << "OK";
    }
    QTextStream in(&file);

    QString text;
    in >> text;

    qDebug( ) << text;

    QString md5;
    QByteArray bb;
    bb = QCryptographicHash::hash ( text.toAscii(), QCryptographicHash::Md5 );
    md5.append(bb.toHex());

    qDebug() << md5;
离线zzxap

只看该作者 10楼 发表于: 2011-03-31
引用第7楼dbzhang800于2011-03-31 09:11发表的  :
如果没有其他理由的话,直接用QFile读入到QByteArray,然后直接计算Md5,去掉所有和 QTextStream以及编码有关的部分




怎样直接用QFile读入到QByteArray?
离线dbzhang800

只看该作者 11楼 发表于: 2011-03-31
引用第10楼zzxap于2011-03-31 09:58发表的  :
怎样直接用QFile读入到QByteArray?
.......



QByteArray QIODevice::readAll ()

题外:
不是针对你,对所有问这类问题的,我基本都会说
多看看manual
离线zzxap

只看该作者 12楼 发表于: 2011-03-31
QFile file(FilePath);
        if ( file.open(QIODevice::ReadOnly) )
        {
            qDebug( ) << "OK";
        }
        QTextStream in(&file);

        QString text;
        in >> text;
        QString md5;
        QByteArray bb;
        bb = QCryptographicHash::hash ( text.toAscii(), QCryptographicHash::Md5 );
        md5.append(bb.toHex());
        return md5;

计算的MD5还是不对
离线dbzhang800

只看该作者 13楼 发表于: 2011-03-31
引用第12楼zzxap于2011-03-31 12:31发表的  :
QFile file(FilePath);
        if ( file.open(QIODevice::ReadOnly) )
        {
            qDebug( ) << "OK";
        }
.......

我想不通的是:计算md5,为什么要经历一遍编解码的过程(而且你又没有保证这个过程是正确的或无损的)。



  1. QFile file(FilePath);
  2. if ( !file.open(QIODevice::ReadOnly) )
  3. {
  4.     //deal with error
  5. }
  6. QByteArray bb = QCryptographicHash::hash (file.readAll(), QCryptographicHash::Md5 );
离线zzxap

只看该作者 14楼 发表于: 2011-03-31
QFile file(FilePath);
    if ( !file.open(QIODevice::ReadOnly) )
    {
        //deal with error
    }
    QByteArray bb = QCryptographicHash::hash (file.readAll(), QCryptographicHash::Md5 );
    return QString(bb);


QString(bb)是乱码。。。。
离线linxy

只看该作者 15楼 发表于: 2011-03-31
回 12楼(zzxap) 的帖子
把你原文跟加密的结果发出来吧
离线zzxap

只看该作者 16楼 发表于: 2011-03-31
return  bb.toHex(); 得到正确结果

多谢 all
离线yaotong195

只看该作者 17楼 发表于: 2011-03-31
肯定要涉及到文件的存储编码格式,ISO文件的编码格式是ISO8859-1,如果使用UTF-8的话出来的MD5 SUM 值是不一样的
QFile file(strPath);
    file.open(QIODevice::ReadOnly);
    QTextCodec *codec = QTextCodec::codecForName("ISO8859-1");
    QTextStream stream(&file);
    stream.setCodec(codec);
    QByteArray bytes = stream.readAll().toAscii();
    QString strMd5 =  QCryptographicHash::hash(bytes,QCryptographicHash::Md5).toHex();
    ui->txtMd5Sum->setText(strMd5.toUpper());
离线cycloneii

只看该作者 18楼 发表于: 2011-03-31
肯定不可能用QString阿,md5是按字节来的,所以不涉及文字编码,应该用QByteArray存文件内容,然后MD5。还有怎么可能用readAll呢?肯定是一小段的慢慢读,慢慢hash嘛,要不然几个G甚至几十个G的文件岂不是把电脑弄崩溃
离线cpp_funs

只看该作者 19楼 发表于: 2012-04-26
QString Hashes::MD5(QFile *fileStream)
    {
        QString md5;

        QByteArray hashData = QCryptographicHash::hash(fileStream->readAll(), QCryptographicHash::Md5);
        md5.append(hashData.toHex());
        fileStream->close();

        return md5;
    }
快速回复
限100 字节
 
上一个 下一个