QDataStream和QByteArray的区别

The difference between QDataStream and QByteArray

本文关键字:区别 QByteArray QDataStream      更新时间:2023-10-16
QTemporaryFile tf;
tf.open ();
QDataStream tfbs (&tf);
tfbs << "hellorn" << "world!rn";
const int pos = int (tf.pos ());
QByteArray ba;
ba.append ("hellorn");
ba.append ("world!rn");
const int size = ba.size ();

基本上我的问题是,我做错了什么?为什么pos> size?我不应该使用<<? 我不应该使用QDataStream吗?

编辑:是否有一种方法来配置QDataStream或QTemporaryFile,使<<操作符不附加32位长度的字符串,并在文件中存储空终止符?调用QDataStream::writeBytes时,我只是有一系列引号字符串和qstring使非常丑陋的代码。

答案在文档中。我不打算详细介绍QByteArray,因为我相信它很明显是按预期工作的。

QDataStream操作符<<(char*)重载求值为writeBytes()函数。

函数输出:

将长度说明符len和缓冲区s写入流and返回对流的引用。len被序列化为一个quint32,后面跟着来自s的len字节。注意,数据没有被编码。

对于"hellorn",我期望输出是:

0,0,0,8,'h','e','l','l','o','r','n',0

4字节长度,后面跟着字符串的字节数。字符串结束的NULL也可能被添加到末尾,这将解释否则神秘的额外两个字节。

所以我最终编写了自己的helper类来序列化我的数据:

class QBinaryStream
{
public:
    QBinaryStream (QIODevice& iod) : m_iod (iod) {}
    QBinaryStream& operator << (const char* data)
    {
        m_iod.write (data);
        return *this;
    }
    QBinaryStream& operator << (const QString& data)
    {
        return operator << (data.toUtf8 ());
    }
    QBinaryStream& operator << (const QByteArray& data)
    {
        m_iod.write (data);
        return *this;
    }
private:
    QIODevice& m_iod;
};

我不应该使用QDataStream吗?

在你的情况下,QTextStream甚至QString都可以。

QTextStream类提供了一个方便的接口来读取和写文本。

QTextStream可以在QIODevice, QByteArray或QString上操作。使用QTextStream的流操作符,您可以方便地读取和写单词,行和数字。

对于QByteArray,应尽可能选用Qstring

QByteArray类提供一个字节数组。

QByteArray可用于存储原始字节(包括'')和传统的以""结尾的8位字符串。使用QByteArray很多比使用const char *更方便。在幕后,它总是确保数据后跟''结束符,并使用隐式共享(写时复制)以减少内存使用并避免不需要复制数据。

除了QByteArray, Qt还提供了QString类来存储字符串数据。在大多数情况下,QString是您想要使用的类。它存储16位Unicode字符,使其易于存储应用程序中的非ascii/非latin -1字符。此外,QString在整个Qt API中使用。两个主要的例子是当你需要存储原始二进制数据时,QByteArray是合适的。当内存保存是至关重要的(例如,Qt for Embedded)Linux) .