Qt里有個專門的類QDataStream
就是專門讀寫二進制數據的, 它與QByteArray搭配在網絡編程中有奇效.
來個栗子:
// write data
QByteArray data;
QDataStream wds(&data, QIODevice::WriteOnly);
char a(1); int b(2); float c(3); double d(4);
wds << a << b << c << d;
// read data
QDataStream rds(data);
char aa; int bb; float cc; double dd;
rds >> aa >> bb >> cc >> dd;
在讀寫字符串的時候, 要注意: QDataStream在寫字符串時, 是會自動加上字符串長度的.
再來個栗子:
QByteArray data;
QDataStream wds(&data, QIODevice::WriteOnly);
ds << "hello";
你猜data
有多長? 10!
為啥呢. 因為hello
再加上\0
一共是6個字節, ds會自動先寫入字符串長度, 是一個int, 也就是4個字節, 所以加起來是10!
那怎么要怎樣只輸出hello
, 而不讓Qt自動添加長度呢? 可以這樣:
QString msg = "hello";
for (int i=0; i<msg.length(); i++)
ds << (unsigned char)msg.at(i).toAscii();
這樣的話, 就能保證data
長度是5了.
總結一下:
如果想讓QDataStream不"自作聰明", 就要按照它頭文件里給它輸入數據.