调整QDataStream

时间:2016-04-13 23:08:39

标签: qt qdatastream

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

代码大纲如下:

QFile fileIn ("the_file");
fileIn.open(QIODevice::ReadOnly);

该文件包含二进制和文本数据。 使用QDataStream读取文件内容:

QDataStream stream(&fileIn);
stream.setByteOrder(QDataStream::LittleEndian);
stream.setVersion(QDataStream::Qt_5_0);

我可以将QDataStream中的数据读入各种数据类型。 e.g。

QString the_value;  // String
stream >> the_value;
qint32 the_num;
stream >> the_numm;

很好,很容易。总的来说,我逐字节地读取文件数据,直到我达到表示分隔符的某些值,例如0x68 0x48。此时我接着接下来的几个字节告诉我接下来是什么类型的数据(浮点数,字符串,整数等)并在适当时提取。

因此,数据是orocessed(大纲),如:

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);
        }
    }
}

某些嵌入数据可能会被压缩,因此我们使用

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的便利性使得在映射到特定类型方面以及在处理字节顺序方面可以轻松读取数据,但这似乎是以牺牲速度为代价的。由于处理是递归的,所以问题更加复杂 - 正在读取的数据本身可能包含嵌入的文件数据,需要以相同的方式读取和处理。

是否存在更快的替代方案,以及如何以同样的方式处理Endianess?

1 个答案:

答案 0 :(得分:1)

你的代码看起来很直接..递归不应该是show stop ...

你有很多字符串吗?成千上万?

new 使用operator>>(char *&s)分配内存非常慢。然后需要手动释放。请参阅readBytes(char *&s, uint &l)方法的Qt文档。这在读入QStrings时使用。

同样适用于readRawData(char *s, int len),这可能被称为内部减慢一切!

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

如果您经常使用其中一种功能,请考虑重写该代码部分,以便在进一步处理之前使用QDataStream直接读入预分配的缓冲区。

总的来说,如果你需要高性能<arg>import</arg> <arg>--options-file</arg> <arg>${optionFile}</arg> <file>${optionFile}</file> <arg>--connection-param-file</arg> <arg>${connParamFile}</arg> <file>${connParamFile}</file> 本身可能就是节目制作者。

相关问题