当前位置: 首页 > 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.lryc.cn/news/622843.html

相关文章:

  • ★CentOS:MySQL数据备份
  • 三天速通 Vue+Flask+SQLite 项目+阿里云轻量应用级服务器【宝塔面板】②
  • 数学建模Topsis法笔记
  • TOGAF八步一法笔记2
  • 【DL学习笔记】常用数据集总结
  • OpenShift 4.19安装中的变化
  • 民法学学习笔记(个人向) Part.5
  • Protues使用说明及Protues与Keil联合仿真实现点亮小灯和流水灯
  • 【运维心得】三步更换HP笔记本电脑外壳
  • C++基础——内存管理
  • C++实战
  • 《深度解构:构建浏览器端Redis控制台的WebSocket协议核心技术》
  • Linux -- 文件【下】
  • 基于Uni-app+vue3实现微信小程序地图固定中心点范围内拖拽选择位置功能(分步骤详解)
  • 谷歌手机刷机和面具ROOT保姆级别教程
  • ubuntu远程桌面很卡怎么解决?
  • 【3D重建技术】如何基于遥感图像和DEM等数据进行城市级高精度三维重建?
  • 数据结构 实现循环队列的三种方法
  • 开源数据发现平台:Amundsen Frontend Service React 配置 Flask 配置 Superset 预览集成
  • Vue 3与React内置组件全对比
  • RK3588芯片在AR眼镜中的核心技术优势是什么?
  • MySQL的三大范式:
  • AI驱动的性能测试:如何用机器学习预测系统瓶颈?
  • ABAP AMDP 是一项什么技术?
  • .NET8下的Garnet使用
  • MySQL查询性能慢时索引失效的排查与优化实践
  • 进程替换:从 “改头换面” 到程序加载的底层逻辑
  • Markdown 生成 Gantt 甘特图
  • 马拉松|基于SSM的马拉松报名系统微信小程序的系统设计与实现(源码+数据库+文档)
  • RK3568 NPU RKNN(一):概念理清