QDataStream和QByteArray之间的区别

时间:2013-04-18 01:03:28

标签: c++ qt qfile

QTemporaryFile tf;
tf.open ();
QDataStream tfbs (&tf);
tfbs << "hello\r\n" << "world!\r\n";
const int pos = int (tf.pos ());

QByteArray ba;
ba.append ("hello\r\n");
ba.append ("world!\r\n");
const int size = ba.size ();

基本上我的问题是,我做错了什么?为什么是pos&gt;尺寸?我不应该使用&lt;&lt; ?我应该不使用QDataStream吗?

编辑:有没有办法配置QDataStream或QTemporaryFile以便&lt;&lt;运算符不预先添加32位长度的字符串并将空终止符存储在文件中?当我只有一系列带引号的字符串和QStrings时,调用QDataStream :: writeBytes会产生非常难看的代码。

3 个答案:

答案 0 :(得分:2)

答案在文档中。我不打算超过QByteArray,因为我相信它的工作正如预期的那样显而易见。

QDataStream运算符&lt;&lt;(char *)重载计算为the writeBytes() function

此功能输出:

  

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

因此对于"hello\r\n",我希望输出为:

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

4字节长度,后跟字符串中的字节。字符串结尾的NULL可能也被添加到结尾,这将解释另外两个神秘的额外两个字节。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

  

我不应该使用QDataStream吗?

在您的情况下,QTextStream甚至QString可能会这样做。

  

QTextStream类为阅读和提供了方便的界面   写文本。

     

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

至于QByteArrayQstring应该尽可能优先选择

  

QByteArray类提供一个字节数组。

     

QByteArray可用于存储两个原始字节(包括'\ 0')和   传统的8位'\ 0'终止字符串。使用QByteArray很多   比使用const char *更方便。在幕后,它始终如一   确保数据后跟'\ 0'终止符,并使用   隐式共享(copy-on-write)以减少内存使用并避免   不必要的数据复制。

     

除了QByteArray之外,Qt还提供了要存储的QString类   字符串数据。对于大多数用途,QString是您要使用的类。   它存储16位Unicode字符,便于存储   应用程序中的非ASCII /非Latin-1字符。此外,   Qttring在Qt API中使用。两个主要案例在哪里   当你需要存储原始二进制数据时,QByteArray是合适的,   当内存保护很关键时(例如,使用Qt for Embedded)   的Linux)。