代码之家  ›  专栏  ›  技术社区  ›  cppguy

QDataStream和QByteArray之间的区别

  •  3
  • cppguy  · 技术社区  · 12 年前
    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>大小我应该不使用<<?我应该不使用QDataStream吗?

    编辑:是否有方法配置QDataStream或QTemporaryFile,以便<&书信电报;运算符不准备32位长度的字符串并将空终止符存储在文件中?当我只有一系列带引号的字符串和QStrings时,调用QDataStream::writeBytes会导致非常难看的代码。

    3 回复  |  直到 12 年前
        1
  •  2
  •   jkerian    12 年前

    答案在文档中。我不打算讨论QByteArray,因为我相信很明显它正在按预期工作。

    QDataStream运算符<&书信电报;(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结尾的字符串可能也被添加到末尾,这将解释额外的两个神秘字节。

        2
  •  0
  •   cppguy    12 年前

    因此,我最终编写了自己的助手类来序列化我的数据:

    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;
    };
    
        3
  •  0
  •   kiriloff    11 年前

    我应该不使用QDataStream吗?

    就你而言,也许 QTextStream 甚至 QString 就可以了。

    QTextStream类为阅读和 书写文本。

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

    至于 QByteArray , Qstring 应该尽可能首选

    QByteArray类提供了一个字节数组。

    QByteArray可用于存储原始字节(包括“\0”)和 传统的以8位“\0”结尾的字符串。使用QByteArray非常重要 比使用const char*更方便。在幕后,它总是 确保数据后面跟着“\0”终止符,并使用 隐式共享(写时复制),以减少内存使用并避免 不必要的数据复制。

    除了QByteArray,Qt还提供了用于存储的QString类 字符串数据。对于大多数目的,QString是您想要使用的类。 它存储16位Unicode字符,便于存储 应用程序中的非ASCII/非Latin-1字符。此外 QString在Qt API中始终使用。两个主要案例 QByteArray适用于需要存储原始二进制数据的情况, 以及当内存保存至关重要时(例如,对于嵌入式的Qt Linux)。