获取开放式QIODevice的校验和

时间:2016-11-14 07:33:13

标签: c++ qt

我需要文件的校验和并找到this,这完全正常。现在我想更改此函数以使用以下行来指向之前已打开的QIODevice

if (!file.open(QFile::ReadOnly | QFile::Text))
{
    ...
}

将其作为设备传递给读取(reader.read(&file);):

bool XmlReader::read(QIODevice* device)
{
    QByteArray b = fileChecksum(device);
    ...
}

这是我对fileChecksum的实现。它返回一个校验和,但我永远陷入循环,我得到一个xml解析错误。我在这做错了什么?

QByteArray XmlReader::fileChecksum(QIODevice* device)
{
    if (device->isOpen())
    {
        QCryptographicHash hash(QCryptographicHash::Sha256);
        if (hash.addData(device)) {
            return hash.result();
        }

    }
    return QByteArray();
}

修改

QByteArray b = fileChecksum(device);之后:

qDebug() << "Checksum: " << b.toHex();

whick保持印刷,印刷和印刷......

解析错误是:premature end of document这是垃圾。

希望这有帮助。

1 个答案:

答案 0 :(得分:1)

由于最终导致错误的代码行不在视野中,我只能推测发生了什么。

名为fileChecksum的{​​{1}}函数读取QIODevice until the end并保持光标位置。

您很可能之后尝试从QIODevice读取,这将解释hash.addData(device)消息。

作为快速解决方法,您可以尝试使用

重置位置
premature end of documen

但是如果可以,你应该只读取一次数据(以支持非随机访问QIODevices)。例如,您可以将结果存储在QBuffer中并将其用作QIODevice。像这样:

auto pos = device->pos();
QByteArray b = fileChecksum(device);
device->seek(pos);