首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调谐QDataStream

调谐QDataStream
EN

Stack Overflow用户
提问于 2016-04-13 23:08:38
回答 1查看 955关注 0票数 0

我有一个程序,在大纲中处理来自afile的二进制数据。

代码大纲如下:

代码语言:javascript
复制
QFile fileIn ("the_file");
fileIn.open(QIODevice::ReadOnly);

该文件混合了二进制数据和文本数据。使用QDataStream读取文件内容:

代码语言:javascript
复制
QDataStream stream(&fileIn);
stream.setByteOrder(QDataStream::LittleEndian);
stream.setVersion(QDataStream::Qt_5_0);

我可以将QDataStream中的数据读入不同的数据类型。例如:

代码语言:javascript
复制
QString the_value;  // String
stream >> the_value;
qint32 the_num;
stream >> the_numm;

又好又轻松。总的来说,我逐字节读取文件数据,直到碰到某些表示分隔符的值,例如0x680x48。此时,我接下来是接下来的几个字节,这些字节告诉我下一步是什么类型的数据(浮点数、字符串、ints等等),并酌情提取。

因此,这些数据被标注(大纲)如下:

代码语言:javascript
复制
while ( ! stream.atEnd() )
{
    qint8 byte1 = getInt8(stream);
    qint8 byte2 = getInt8(stream);
    if ( byte1 == 0x68 && byte2 == 0x48 )   
    {
        qint8 byte3 = getInt8(stream);
        qint8 byte4 = getInt8(stream);
        if ( byte3 == 0x1 && byte4 == 0x7 )
        {
            do_this(stream);
        } 
        else if ( byte3 == 0x2 && byte4 == 0x8 )
        {
            do_that(stream);
        }
    }
}

一些嵌入的数据可能会被压缩,所以我们使用

代码语言:javascript
复制
long dSize = 1024;
QByteArray dS = qUncompress( stream.device()->read(dSize));

QBuffer buffer;
buffer.setData(dS);

if (!buffer.open(QBuffer::ReadOnly)) {
    qFatal("Buffer could not be opened. Something is very wrong!");
}

QDataStream stream2(&buffer);
stream2.setByteOrder(QDataStream::LittleEndian);
stream2.setVersion(QDataStream::Qt_5_0);

QDataStream的方便使读取数据变得很容易,既可以映射到特定类型,也可以轻松地处理数据,但它似乎牺牲了速度。复杂的问题是,处理是递归的-被读取的数据本身可能包含嵌入式文件数据,这些数据需要以同样的方式读取和处理。

有没有一种更快的选择,那么,如果,那么,如何处理同样的恩典?

EN

回答 1

Stack Overflow用户

发布于 2016-04-14 06:10:22

你的代码向前看..。递归不应该是节目的停止..。

你有很多弦吗?上千人?

stream >> string使用new分配内存,真正慢的是什么。之后需要手动释放。有关operator>>(char *&s)方法,请参阅Qt。这是在读取到QStrings时使用的。

readBytes(char *&s, uint &l)也是如此,它可能在内部被称为减慢一切!

QString本身也将分配内存(是使用16位编码的两倍),这将进一步减缓速度。

如果您经常使用这些函数之一,那么在进一步处理之前,请考虑重写这些代码部分,以便使用readRawData(char *s, int len)直接读取预分配的缓冲区。

总的来说,如果您需要高性能的QDataStream本身很可能是节目的停播。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36611111

复制
相关文章

相似问题

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