2012-01-30 383 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

相关问题