2012-01-30 7 views
3

QDataStreamとソケットプログラミングについてはかなり新しいです。クライアントからホストにquint32ヘッダ値(4バイト)を送信するだけです。しかし、私は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、およびfriendsを使用する必要があります。 「int」と「long」を正気にすることは狂っている。 – Lalaland

+0

私は 'uint32_t a = htonl(32)'を試しましたが、結果はまだ同じです... –

答えて

6

ds.readRawData()でデータを読み取ろうとする前に、ds.device()->reset();を呼び出してストリームデバイスの位置をリセットする必要があります。

ds.readRawData()は、読み込まれたバイト数を返します。あなたがそれをチェックすれば、おそらく0を返しているでしょう。

+0

ああ、答え、ありがとう! –