【问题标题】:Get the checksum of an open QIODevice获取打开的 QIODevice 的校验和
【发布时间】:2016-11-14 07:33:13
【问题描述】:

我需要一个文件的校验和并找到this,它工作得很好。现在我想更改此函数以获取指向之前已打开的QIODevice 的指针,其中包含以下几行:

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

这被传递以读取 (reader.read(&file);) 作为设备:

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

这是我对文件校验和的实现。它返回一个校验和,但我永远陷入循环并且我收到一个 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 这是垃圾。

希望这会有所帮助。

【问题讨论】:

  • 能否请您发布确切的错误文本?另外,您在哪个循环中被抓到也不是很清楚,请您澄清一下吗?
  • @tobilocker 错误出现在此问题中未包含的代码部分中。您应该知道addData 函数很可能会读取整个文件,然后不会“倒回”光标,因此您可能想要执行auto pos = device-&gt;pos();QByteArray b = fileChecksum(device);device-&gt;seek(pos);
  • @PeterT 做到了!完美的!如果您只是添加这些行作为答案,我可以接受。

标签: c++ qt


【解决方案1】:

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

函数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 */
}

【讨论】:

  • 猜对了!谢谢。
  • 你没有测试这个对吗?以上不会编译。使用QBuffer 建议的解决方案中有几个错误。 QByteArray contents = device.readAll(); 显然不起作用,因为 device 是一个指针。 QBuffer 构造函数接受一个指向 QByteArray 的指针,所以它必须是 QBuffer buffer(&amp;contents)。这也会导致相同的解析器错误premature end of document
  • @tobilocker 是的,没有尝试编译。此外,当错误仍然出现时,您可能从 device 之外的 XmlReader::read 函数中读取,我没有假设。我想只要确保你传入的QIODevice 是一个随机访问设备,然后你就可以依赖最初的解决方法。
猜你喜欢
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 2015-04-30
相关资源
最近更新 更多