首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QDataStream和QByteArray之间的区别

QDataStream和QByteArray之间的区别
EN

Stack Overflow用户
提问于 2013-04-18 09:03:28
回答 3查看 2.7K关注 0票数 3
代码语言:javascript
复制
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吗?

编辑:有没有一种方法可以配置QDataStream或QTemporaryFile,使<<操作符不会预先添加32位长度的字符串,并将空终止符存储在文件中?当我只有一系列带引号的字符串和QStrings时,调用QDataStream::writeBytes会使代码变得非常丑陋。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-18 09:16:14

答案就在文档中。我不打算介绍QByteArray,因为我相信很明显,它的工作方式与预期的一样。

QDataStream operator<<(char*)重载的计算结果为the writeBytes() function

此函数输出:

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

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

代码语言:javascript
复制
0,0,0,8,'h','e','l','l','o','\r','\n',0

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

票数 2
EN

Stack Overflow用户

发布于 2013-04-18 09:47:03

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

代码语言:javascript
复制
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;
};
票数 0
EN

Stack Overflow用户

发布于 2013-11-09 16:19:58

我不应该使用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字符。此外,在Qt中始终使用QString。QByteArray适用的两种主要情况是您需要存储原始二进制数据时,以及内存保护非常关键的情况(例如,对于嵌入式Linux使用Qt )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16072812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档