gpt4 book ai didi

c++ - 获取打开的 QIODevice 的校验和

转载 作者:行者123 更新时间:2023-11-28 05:25:41 26 4
gpt4 key购买 nike

我需要一个文件的校验和并找到this ,效果很好。现在我想更改此函数以获取指向之前已使用以下行打开的 QIODevice 的指针:

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

这作为设备传递给 read (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();

which 继续打印,打印,打印...

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

希望这对您有所帮助。

最佳答案

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

调用hash.addData(device) 的函数fileChecksum 读取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 */
}

关于c++ - 获取打开的 QIODevice 的校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40583840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com