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
一、解决方案
-
- 可以转换为其他类型,比如
QByteArray
,可以正常处理\0
或0x00
。
- 可以转换为其他类型,比如
-
- 调用或写入设备时明确长度,比如使用QIODevice的write函数时,不要只传递数据,还要传入其Size (如下所示,
推荐使用第一个和第三个函数
):
- 调用或写入设备时明确长度,比如使用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