ZBLOG

QByteArray tcpServer::SendData(QByteArray dataHeard, QString strData) { quint16 dataSize = static_cast(strData.toUtf8().size()); // 计算数据长度 //qDebug()

根据你提供的代码和描述,qDebug() 打印出的 sendDataArraystr111 不一致的问题可能由以下几个原因引起。让我们逐步分析,并提出一些解决方案。

代码分析

  1. 数据构造

    • SendData(QByteArray dataHeard, QString strData) 函数会将 dataHeard 和传入的 strData 转换为 UTF-8 格式并组合成一个新的 QByteArray。
    • 在构造 sendArray 时,你添加了两个字节的长度信息(高位和低位),这可能会影响接收方解析时所看到的数据。
  2. 字节发送

    • 在发送过程中,你使用了一个循环来分块发送数据,每次更新已写字节数时减去了10,这可能导致下一次迭代读取不正确的部分。
  3. 字符编码问题

    • 确保在整个流程中对字符串的编码保持一致。特别是从 QByteArray 到 QString 的转换以及返回值使用的一致性。

解决方案

  1. 验证 SendData 函数输出

    • 在调用 SendData() 后,直接打印出 sendDataArray 的十六进制格式,以确保它包含你期望的所有字节:
    qDebug() << "sendDataArray (hex):" << sendDataArray.toHex();
    
  2. 检查包头大小计算

    • 检查是否在处理每个数据块时都准确传递了大小。如果你的数据包头有固定长度(如 2 字节用于 size),需要确保这一点:
    // 使用合适的方法设置 bytesWritten
    bytesWritten += sizeWritten; // 如果 sizeWritten 表示实际已发送的数据量,不应减去任何值
    
  3. 避免过度截断发送字节数

    • 如上所述,尽量不要通过减去常量来更新已写字节数,这可能导致读取错误的数据。仅需根据实际写入的字节进行更新。
  4. 发送结束标志或空包

    • 当你完成所有数据块后,还要考虑如何结束这个消息。例如,你可以只向客户端发送一个特定结构或者标志位来表示“结束”而不是简单地依赖于静态量。
  5. 统一编码方式

    • 确保在整个应用程序中始终使用相同的编码方式(UTF-8)。可以用下面的方法查看不同操作之间是否存在编码变化:
    QString str = QString::fromUtf8(sendDataArray);
    qDebug() << "sendData content:" << str;
    qDebug() << "Original JSON Data:" << str111;
    
  6. 单独调试与小数据块测试

    • 可以尝试把要发送的数据缩小到更小的范围,比如仅测试一段固定字符串,这样有助于更快发现问题。

通过以上步骤,可以帮助识别问题根源,从而确保两者打印结果一致。如果仍然有疑问,请提供更多细节,例如具体显示哪些内容不一样、预期行为是什么等。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=22398

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?