当前位置: 首页 > 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.dtcms.com/a/334014.html

相关文章:

  • 小白学投资理财 第一天
  • 算力与显存、显存带宽的关系
  • 【php反序列化介绍与常见触发方法】
  • Houdini Vop学习笔记
  • 测试工程师的AI转型指南:从工具使用到测试策略重构
  • TDengine IDMP 高级功能(4. 元素引用)
  • OpenAI TTS API + Web 前端 AudioContext 实战方案
  • 【Web后端】Django、flask及其场景——以构建系统原型为例
  • 《深度解构:构建浏览器端Redis控制台的WebSocket协议核心技术》
  • Protues使用说明及Protues与Keil联合仿真实现点亮小灯和流水灯
  • 【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
  • C#WPF实战出真汁08--【消费开单】--餐桌面板展示
  • C语言基础:(十五)深入理解指针(5)
  • 数据清洗:数据处理的基石
  • 【C++】异常详解(万字解读)
  • 【lubancat】鲁班猫4实现开机后自动播放视频
  • MySQL查询性能慢时索引失效的排查与优化实践
  • AI驱动的性能测试:如何用机器学习预测系统瓶颈?
  • 开源 Arkts 鸿蒙应用 开发(十七)通讯--http多文件下载
  • 储能领域大数据平台的设计中如何使用 Hadoop、Spark、Flink 等组件实现数据采集、清洗、存储及实时 / 离线计算,支持储能系统分析与预测
  • 三天速通 Vue+Flask+SQLite 项目+阿里云轻量应用级服务器【宝塔面板】②
  • IO流与单例模式
  • java项目怎么实现用户行为分析、漏斗转化、数据可视化报表。
  • 奈飞工厂 —— 算法优化实战推荐
  • QT基础入门
  • AI热点周报(8.10~8.16):AI界“冰火两重天“,GPT-5陷入热议,DeepSeek R2模型训练受阻?
  • SpringBoot学习日记(九)
  • uv - 基本使用
  • 【LeetCode 热题 100】70. 爬楼梯——(解法二)自底向上
  • [1Prompt1Story] 滑动窗口机制 | 图像生成管线 | VAE变分自编码器 | UNet去噪神经网络