在做Qt的序列化和反序列化,粘包问题解决的时候,需要自己定义消息的格式。粘包问题解决后,但是发现消息中多了点东西。有问题,先打印出来看看,用QByteArray中的toHex打印16进制是比较好的做法。
起因:
一、起因
每条消息 = 总长度 + 消息号 + 内容
QByteArray msgContent = "hello";
quint16 msgId = 1000;
quint16 msgLen = static_cast<quint16>(msgContent.size());
QByteArray totalData;
QDataStream dataStream(&totalData, QIODevice::WriteOnly);
quint16 totalLen = static_cast<quint16>(msgLen) + sizeof(msgId) + sizeof(quint16);
dataStream << totalLen << msgId << msgContent;
qDebug() << "msgContent: " << totalData.toHex(':');
打印出来的东西多了一些:
msgContent: "00:09:03:e8:00:00:00:05:68:65:6c:6c:6f"
00 00 00 05是多出来的,这个是我不需要,在解决粘包的时候,我会根据消息的总长度分分割。
于是,我写了一些小的测试代码。
二、测试代码
QByteArray totalData;
QDataStream dataStream(&totalData, QIODevice::WriteOnly);
QByteArray msgContent = "hello";
dataStream << msgContent;
qDebug() << "msgContent: " << totalData.toHex(':');
先看这个代码里,打印出的内容是什么?
msgContent: "00:00:00:05:68:65:6c:6c:6f"
00 00 00 05是msgContent的长度,后面是msgContent的内容。
三、解决方法
QByteArray totalData;
QDataStream dataStream(&totalData, QIODevice::WriteOnly);
QByteArray msgContent = "hello";
// dataStream << msgContent;
dataStream.writeRawData(msgContent, msgContent.size());
qDebug() << "msgContent: " << totalData.toHex(':');
现在看,打印的内容是什么?
msgContent: "68:65:6c:6c:6f"
这才是我需要的。
也可以写成:
QByteArray totalData;
QDataStream dataStream(&totalData, QIODevice::WriteOnly);
QByteArray msgContent = "hello";
// dataStream << msgContent;
totalData += msgContent;
// dataStream.writeRawData(msgContent, msgContent.size());
qDebug() << "msgContent: " << totalData.toHex(':');
这时候打印的内容是:
msgContent: "68:65:6c:6c:6f"