我必须从TCP套接字接收数据。它具有固定的16字节头(一个头的字段是数据长度)和数据。我用BigEndian收到它,但是它是用LittleEndian发送的。
我可以'找到这种数据接收的好方法。现在对我有用的是(阅读其中一个标题字段):
QByteArray packetType = tcpSocket->read(2);
QDataStream in(packetType);
in.setByteOrder(QDataStream::LittleEndian);
quint16 pT = 0;
in >> pT;
有没有更好的方法来设置QByteArray endianess? 或者用QDataStream读取指定字节数的方法?
答案 0 :(得分:1)
你几乎做得对。中间QByteArray
是不必要的。您可以直接在套接字上设置数据流:
QTcpSocket socket;
QDataStream in(&socket);
in.setByteOrder(QDataStream::LittleEndian);
...
void onReadyRead() {
in.startTransaction();
uint16_t packet_type;
in >> packet_type;
if (in.status == QDataStream::Ok) {
if (packet_type == Foo) {
uint32_t foo_data;
in >> foo_data;
if (! in.commitTransaction())
return; // not enough data
// got a full packet here
}
}
in.abortTransaction();
}