我们来分析一下这两种印象的区别:
"\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
为此,让我们回顾一下源代码:
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()
方法,并根据文档:
QDataStream &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