QByteArray ba;
QDataStream ds(&ba,QIODevice::WriteOnly);
ds<<quint8(1)<<quint16(2)<<quint32(3); //1+2+4
qDebug()<<"size:"<<ba.size(); // 7
我用QDataStream
写3号,ba.size()是7,但我对此感到困惑:
QByteArray ba;
QDataStream ds(&ba,QIODevice::WriteOnly);
QString s="a";
ds<<quint8(1)<<quint16(2)<<quint32(3)<<s; //1+2+4+a
qDebug()<<"size:"<<ba.size(); // 13
如果QString的size
为1,ba的大小加6,那为什么? sizeof(QString)
是4。
答案 0 :(得分:2)
让我们分析两种展示之间的差异:
"\x01\x00\x02\x00\x00\x00\x03"
"\x01\x00\x02\x00\x00\x00\x03\x00\x00\x00\x02\x00""a"
-----------------------------------------------------
x00\x00\x00\x02\x00""a
为此,让我们回顾source code:
QDataStream &operator<<(QDataStream &out, const QString &str)
{
if (out.version() == 1) {
out << str.toLatin1();
} else {
if (!str.isNull() || out.version() < 3) {
if ((out.byteOrder() == QDataStream::BigEndian) == (QSysInfo::ByteOrder == QSysInfo::BigEndian)) {
out.writeBytes(reinterpret_cast<const char *>(str.unicode()), sizeof(QChar) * str.length());
} else {
QVarLengthArray<ushort> buffer(str.length());
const ushort *data = reinterpret_cast<const ushort *>(str.constData());
for (int i = 0; i < str.length(); i++) {
buffer[i] = qbswap(*data);
++data;
}
out.writeBytes(reinterpret_cast<const char *>(buffer.data()), sizeof(ushort) * buffer.size());
}
} else {
// write null marker
out << (quint32)0xffffffff;
}
}
return out;
}
该方法使用writeBytes()
方法,
并根据docs:
QDataStream&amp; QDataStream :: writeBytes(const char * s,uint len)
将长度说明符len 和缓冲区s 写入流中 返回对流的引用。
len被序列化为quint32,后跟来自s的len个字节。注意 数据未编码。
也就是说,除了写入数据之外,以quint32
格式(4个字节)写入文本的长度,缓冲区的长度等于sizeOf(QChar)
x length of the QString
。
考虑到它,我们可以更好地理解结果:
x00\x00\x00\x02 \x00""a
--------------- -------
numbers of bytes of buffer buffer
通常,您可以使用以下公式计算存储数据的大小:
length stored data = 4 + 2 x length of string
答案 1 :(得分:1)
通过检查Qt Documentation for QDatastream,如何存储和检索字符串:
char *字符串被写为等于长度的32位整数 包含'\ 0'字节的字符串,后跟所有字符 包含'\ 0'字节的字符串。读取char *字符串时,4 读取字节以创建32位长度值,然后那么多 包含'\ 0'终止符的char *字符串的字符是 读取。
所以在你的情况下,字符串长度为32位,“a”为1字节,\ 0为1字节,总计为6字节。