1
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

如果 QStringsize是 1,ba 的大小加 6,为什么会这样?sizeof(QString)是 4。

4

2 回答 2

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

为此,让我们回顾一下源代码

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
于 2018-05-28T02:44:43.767 回答
1

通过检查QDatastream 的 Qt 文档,字符串是如何存储和检索的:

一个 char * 字符串被写成一个 32 位整数,等于字符串的长度,包括 '\0' 字节,后跟字符串的所有字符,包括 '\0' 字节。读取 char * 字符串时,读取 4 个字节以创建 32 位长度值,然后读取 char * 字符串的许多字符,包括 '\0' 终止符。

因此,在您的情况下,字符串长度为 32 位 + “a”为 1 个字节 + \0 为 1 个字节,总和为 6 个字节。

于 2018-05-28T02:43:31.080 回答