最近發現從QDataStream向QByteArray中寫入數據常常是寫不進去的,通過查看QT的源碼:

QDataStream &operator>>(QDataStream &in, QByteArray &ba)
{
ba.clear();
quint32 len;
in >> len;
if (len == 0xffffffff)
return in;
const quint32 Step = 1024 * 1024;
quint32 allocated = 0;
do {
int blockSize = qMin(Step, len - allocated);
ba.resize(allocated + blockSize);
if (in.readRawData(ba.data() + allocated, blockSize) != blockSize) {
ba.clear();
in.setStatus(QDataStream::ReadPastEnd);
return in;
}
allocated += blockSize;
} while (allocated < len);
return in;
}
發現原來其中有一句:
1
|
if
(in.readRawData(ba.data() + allocated, blockSize) != blockSize) {
|
它檢查讀入的數據是不是整數個blockSize,如果不是,那么下面它會將QByteArray清空:
1
|
ba.clear();
|
所以如果想從QDataStream讀入數據島QByteArray中,可以采用下面的方法:

QDataStream &operator>>(QDataStream &in, QByteArray &ba)
{
ba.clear();
quint32 len;
in >> len;
if (len == 0xffffffff)
return in;
const quint32 Step = 1024 * 1024;
quint32 allocated = 0;
do {
int blockSize = qMin(Step, len - allocated);
ba.resize(allocated + blockSize);
if (in.readRawData(ba.data() + allocated, blockSize) < blockSize) {
return in;
}
allocated += blockSize;
} while (allocated < len);
return in;
}
最后回過頭來看一下將QByteArray寫入QDataStream的方法

QDataStream &operator<<(QDataStream &out, const QByteArray &ba)
{
if (ba.isNull() && out.version() >= 6) {
out << (quint32)0xffffffff;
return out;
}
return out.writeBytes(ba, ba.size());
}
其實是將QByteArray中所有的數據都寫入QDatStream中,並沒有擴展QByteArray的大小到blockSize,
所以針對這種情況,我們在使用QDataStream向QByteArray中讀寫數據的時候,需要手動將QByteArray
擴展到blockSize(1024*1024)大小。