QDataStream和QByteArray的区别
The difference between QDataStream and QByteArray
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) .
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C++ - "!pointer"和"pointer == nullptr"的区别?
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 返回递归调用和仅递归调用的区别
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- QDataStream和QByteArray的区别