当前位置: 首页 > news >正文

Qt 关于QString和std::string数据截断的问题- 遇到\0或者0x00如何处理?

Qt 关于QString和std::string数据截断的问题- 遇到\0或者0x00如何处理?

  • 引言
  • 一、解决方案
  • 二、使用QByteArray注意事项

引言

在Qt开发中,使用QString或std::string获取、发送字符串时,遇到\0(空字符)或者0x00(十六进制表示)可能导致数据截断,因为其会将以上数据视为字符串终止符,导致后续数据被丢弃。

C 语言中字符串的结束标志\0:https://zhuanlan.zhihu.com/p/720768702
深入解析 C++ 中字符串的结尾标志 \0:https://blog.csdn.net/zy4213/article/details/141830309

一、解决方案

    1. 可以转换为其他类型,比如QByteArray,可以正常处理\00x00
    1. 调用或写入设备时明确长度,比如使用QIODevice的write函数时,不要只传递数据,还要传入其Size (如下所示,推荐使用第一个和第三个函数):
qint64 write(const char *data, qint64 len);       // 推荐使用
qint64 write(const char *data);                   // 不建议使用此函数
inline qint64 write(const QByteArray &data)       // 和第一个一样
{ return write(data.constData(), data.size()); }

传输文件数据中存在多个 \0怎么避免截断:https://blog.csdn.net/qq_49502822/article/details/145550671
Qt中执行write(data.constdata),在数组中“0x00”值处出现断针【已解决】:https://blog.csdn.net/Taylor_0522/article/details/101343941

二、使用QByteArray注意事项

  • QByteArray的互转需要注意截断

QbyteArray 包含 0x00 转换为 QString 时数据被截断:https://blog.csdn.net/wrs000001/article/details/125168561

  • 调用函数传参也要注意,比如以下例子,函数参数为QString,但传入的是QByteArray (不会报错,会自动转换),QByteArray里包含0x00,自动转为QString就会产生数据丢失。
void print_cs(QString s){qDebug() << s.toLatin1().toHex();
}
    QByteArray cs;QDataStream ds(&cs, QIODevice::WriteOnly);ds << uint8_t(0x11);ds << uint8_t(0x22);ds << uint8_t(0x00);ds << uint8_t(0x33);qDebug() << cs.toHex();print_cs(cs);
  • 输出结果如下所示:
    在这里插入图片描述

QString和QByteArray:https://blog.csdn.net/imred/article/details/104256932

http://www.xdnf.cn/news/1312111.html

相关文章:

  • 【经典上穿突破】副图/选股指标,双均线交叉原理,对价格波动反应灵敏,适合捕捉短期启动点
  • [1Prompt1Story] 注意力机制增强 IPCA | 去噪神经网络 UNet | U型架构分步去噪
  • PowerShell 第11章:过滤和比较(上)
  • 云安全 - The Big IAM Challenge
  • 二分查找。。
  • 智能合约:区块链时代的“数字契约革命”
  • AutoDL使用学习
  • 【Java web】Servlet 详解
  • CUDA 编程笔记:CUDA延迟隐藏
  • [优选算法专题二滑动窗口——最大连续1的个数 III]
  • huggingface TRL中是怎么获取参考模型的输出的
  • Swift 实战:实现一个简化版的 Twitter(LeetCode 355)
  • 新手向:GitCode疑难问题诊疗
  • Java 10 新特性及具体应用
  • 嵌入式硬件篇---电感串并联
  • 2^{-53} 单位舍入误差、机器精度、舍入的最大相对误差界限
  • 实例分割-动手学计算机视觉13
  • docker安装mongodb及java连接实战
  • Effective C++ 条款45:运用成员函数模板接受所有兼容类型
  • Linux怎么查看服务器开放和启用的端口
  • 【原理】C# 字段、属性对比及其底层实现
  • illustrator插件大全 免费插件介绍 Ai设计插件集合 (3)
  • Python语言一键整理xhs评论 基于github的开源项目 MediaCrawler
  • Linux进程概念(四)环境地址变量
  • 同创物流学习记录2·电车
  • 链式二叉树的基本操作——遍历
  • 实时计算 记录
  • 美国服务器环境下Windows容器工作负载基于指标的自动扩缩
  • 从盲区到全域:黎阳之光视频孪生+AI智能算法驱动智慧机场三维感知革命
  • 4.6 Vue 3 中的模板引用 (Template Refs)