使用QDataStream读写原始数据

6

我对QDataStream和Socket编程比较陌生,我的目标是从客户端向主机发送一个quint32头部值(四个字节)。但是我在使用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的用法有所误解?


在处理原始字节时,应使用<cstdint>、uint32_t、uint8_t等。这通常发生在网络工作中。依赖于“int”和“long”是不明智的。 - user406009
我已经尝试过“uint32_t a = htonl(32)”,但结果仍然相同... - TimC
1个回答

8
在尝试使用 ds.readRawData() 读取数据之前,您应该通过调用 ds.device()->reset(); 来重置流设备的位置。 ds.readRawData() 将返回已读取的字节数。如果您检查它,可能会返回 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接