首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取打开的QIODevice的校验和

获取打开的QIODevice的校验和
EN

Stack Overflow用户
提问于 2016-11-14 07:33:13
回答 1查看 174关注 0票数 0

我需要一个文件的校验和,并找到,它工作得很好。现在,我希望更改此函数,以获得指向前面用以下行打开的QIODevice的指针:

代码语言:javascript
复制
if (!file.open(QFile::ReadOnly | QFile::Text))
{
    ...
}

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

代码语言:javascript
复制
bool XmlReader::read(QIODevice* device)
{
    QByteArray b = fileChecksum(device);
    ...
}

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

代码语言:javascript
复制
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);之后我做了:

代码语言:javascript
复制
qDebug() << "Checksum: " << b.toHex();

一直在印刷..。

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

希望这能有所帮助。

EN

回答 1

Stack Overflow用户

发布于 2016-11-16 12:59:15

由于最终导致错误的代码行没有出现,所以我只能猜测发生了什么。

函数fileChecksum调用hash.addData(device),它读取QIODevice直到结束并保持光标在那里的位置。

很可能之后您尝试从QIODevice中读取,这将解释premature end of documen消息。

作为一个快速的解决方法,您可以尝试重新设置位置之后,用

代码语言:javascript
复制
auto pos = device->pos();
QByteArray b = fileChecksum(device);
device->seek(pos);

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

代码语言:javascript
复制
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 */
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40583840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档