我需要文件的校验和并找到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
这是垃圾。
希望这有帮助。
答案 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);