2012-01-30 380 views
3

我對QDataStream和Socket編程相當陌生,我想要做的就是簡單地從客戶端向主機發送一個quint32頭部值(四個字節)。但是我在使用QDataStream時遇到了一些麻煩。使用QDataStream讀取/寫入原始數據

QByteArray data; 
QDataStream ds(&data, QIODevice::ReadWrite); 
int a = htonl(32); 
char *head = (char*)&a; 
for(int i=0;i<4;i++) 
    qDebug() << QString::number(int((head[i]&0xff))+0x100, 16) << " "; 
qDebug() << endl; 

這裏,輸出是「100 100 100 120」,這正是我想要的。 然後我嘗試將它寫入數據流。

ds.writeRawData(head, 4); 
char *buffer = new char[4]; 
ds.readRawData(buffer, 4); 
for(int i=0;i<4;i++) 
    qDebug() << QString::number(int((buffer[i]&0xff))+0x100, 16) << " "; 
qDebug() << endl; 

但在這裏這裏的輸出爲 「100 100 100 100」

我會遇到關於QDataStream的使用的一些誤解?

+0

當你在處理原始字節的網絡上工作時,你應該使用和uint32_t,uint8_t和朋友。依靠「int」和「long」來理智是瘋狂的。 – Lalaland 2012-01-30 03:42:28

+0

我試過'uint32_t a = htonl(32)',但結果仍然是一樣的...... – 2012-01-30 03:52:04

回答

6

在嘗試使用ds.readRawData()讀取數據之前,您應該通過調用ds.device()->reset();來重置流設備的位置。

ds.readRawData()將返回讀取的字節數。如果你檢查它,它可能會返回0

+0

啊,對了,謝謝你的回答! – 2012-01-30 07:19:45

相關問題