【问题标题】:The difference between QDataStream and QByteArrayQDataStream 和 QByteArray 的区别
【发布时间】:2013-04-18 01:03:27
【问题描述】:
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 > size?我不应该使用

编辑:有没有办法配置 QDataStream 或 QTemporaryFile 以使

【问题讨论】:

  • 如果您指出 possize 的实际含义可能会有所帮助。
  • pos == 25, size == 15
  • 第一个是流,第二个是数组,它们的用途完全不同,经常一起使用
  • 我知道服务不同的目的。我只是想了解为什么临时文件比预期的大

标签: c++ qt qfile


【解决方案1】:

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

QDataStream 运算符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 可能也被添加到末尾,这将解释原本神秘的额外两个字节。

【讨论】:

  • 是的,我错过了。希望有一种更干净的标准方式将字符串写入临时文件
  • @cppguy - 也许与 QTextStream?
  • 不幸的是,我正在编写字符串,然后是一个大的 QByteArray。我希望能处理所有这些情况
【解决方案2】:

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

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】:

    我不应该使用 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/非拉丁 1 字符。此外, QString 在整个 Qt API 中使用。两种主要情况 当您需要存储原始二进制数据时,QByteArray 是合适的, 当内存保护至关重要时(例如,使用 Qt for Embedded Linux)。

    【讨论】:

      猜你喜欢
      • 2020-07-10
      • 2023-03-08
      • 2014-06-09
      • 2019-05-26
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 2014-07-29
      • 2016-07-07
      相关资源
      最近更新 更多