Давайте проанализируем разницу между двумя показами:
"\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, за которым следует 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