QT 使用QDataStream写入QByteArray数据时遇到的坑

在做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"

参考:
QT 使用QDataStream时遇到的坑
QDataStream传递自定义的数据类型

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值