[Qt-interest] QDataStream writing a quint32 twice

Dan Milburn danmilburn at clara.co.uk
Fri Dec 11 15:56:25 CET 2009


Rohan Prabhu wrote:
> This is a rather strange problem I'm facing. Have a look at this code:
> 
> QDataStream out(&block, QIODevice::WriteOnly);
> QString newString("Hello.World.This.is.the.message");
> QByteArray newByte = newString.toAscii();
> 
> //Send to stream the magic words
> out<<(quint8)'x';
> out<<(quint8)0x37;
> out<<(quint8)0x4B;
> 
> //Send to stream the version numbers
> out<<(quint8)0x00;
> out<<(quint8)0x01;
> 
> //Send to stream the size of the request
> [LINE] out<<(quint32)((newString.toAscii()).size());
> 
> //Send to stream the data
> out<<newString.toAscii();
> 
> std::cout<<std::endl;
> 
> Now, the contents of the QByteArray 'block' are:
> 
> 0x78 0x37 0x4b 0x0 0x1 _*0x0 0x0 0x0 0x1f 0x0
> 0x0 0x0 0x1f*_ 0x48 0x65 0x6c 0x6c 0x6f 0x2e 0x57
> 0x6f 0x72 0x6c 0x64 0x2e 0x54 0x68 0x69 0x73 0x2e
> 0x69 0x73 0x2e 0x74 0x68 0x65 0x2e 0x6d 0x65 0x73
> 0x73 0x61 0x67 0x65
> 
> The bold and underlined text is the 'size' variable, the line of output 
> is mentioned by the prefix [LINE] in the code. The size of the string is 
> 31 bytes [which is 0x1F bytes]. And 0x48, 0x65 and 0x6C are the hex 
> codes for 'H', 'e' and 'l' respectively. So, basically, it is clear that 
> the size variable is being written twice. Now I dont quite understand 
> why. I made the variable newByte to test and found out it's contents. 
> The contents started at 0x48 0x65 and so on.. So basically, the 
> ByteArray construction is proper via QString::toAscii(), but for some 
> reason, the size variable is being inserted twice.
> 
Hi,

That would be because the QDataStream operator for QByteArray writes the 
size first.  See http://qt.nokia.com/doc/4.6/datastreamformat.html.

Dan



More information about the Qt-interest-old mailing list