【轉】從QDataStream向QByteArray中寫入數據時的注意點(QT)


 

最近發現從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)大小。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM