我需要文件的校验和并找到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();


威士忌不断印刷和印刷...

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

希望这可以帮助。

最佳答案

由于看不到最终导致错误的代码行,因此我只能推测发生了什么。

名为fileChecksum的函数hash.addData(device)读取QIODevice until the end并将光标保持在该位置。

很有可能您之后尝试读取QIODevice来解释premature end of documen消息。

作为一种快速的解决方法,您可以尝试在之后使用

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


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

bool XmlReader::read(QIODevice* device)
{
    QByteArray contents = device->readAll();
    QBuffer buffer(&contents);
    device = &buffer;//you can also just use &buffer from here on out instead of overwriting the pointer
    QByteArray b = fileChecksum(device);
    device->reset();
    /* ... further reads from device here */
}

10-06 16:16