gpt4 book ai didi

qt - QString 和嵌入的空值

转载 作者:行者123 更新时间:2023-12-04 09:34:19 28 4
gpt4 key购买 nike

来自 https://doc.qt.io/qt-5/qstring.html
“QString 可以嵌入 '\0' 字符(QChar::Null)。size() 函数始终返回整个字符串的大小,包括嵌入的 '\0' 字符。”
然而我观察到:

QString frameDataAsString =
"SEND\n"
"content-length:23\n\n"
"Before a Null\0And after";
在 GDB 中:
(gdb) p frameDataAsString
$1 = "SEND\ncontent-length:23\n\nBefore a Null"
(gdb) p frameDataAsString.size()
$2 = 37
那么,如何在字符串中“嵌入 NULL”?

最佳答案

构造函数 QString::QString(const char*)不能用于嵌入 \0人物。它将复制传递的参数直到第一个 0 终止符(无论它是显式编码还是隐式附加)。
我考虑使用临时 QByteArray但是文档。 ( QString::QString(const QByteArray &ba) ) 提到相应的。构造函数QString::QString(const QByteArray&)也会考虑 0 个终结符。
令人惊讶的是,QString::from函数(例如 QString::fromLatin1()QString::fromUtf8() )似乎正确地考虑了传递的长度。
OP 找到了另一种方法 - 使用 QStringLiteral() .它可以专门应用于 C 字符串文字。
演示:

// Qt header:
#include <QtCore>

// main application
int main()
{
const char cstr[] = "A string with a \0 inside.";
const size_t sizeCStr = sizeof cstr / sizeof *cstr, lenCStr = sizeCStr - 1;
const QByteArray qBytes(cstr, sizeCStr);
qDebug() << "qBytes:" << qBytes << "length:" << qBytes.size();
const QString qStr0(qBytes);
qDebug() << "qStr0:" << qStr0 << "length:" << qStr0.size();
const QString qStr1 = QString::fromLatin1(cstr, sizeCStr);
qDebug() << "qStr1:" << qStr1 << "length:" << qStr1.size();
const QString qStr2 = QString::fromUtf8(cstr, sizeCStr);
qDebug() << "qStr2:" << qStr2 << "length:" << qStr2.size();
const QString qStrL(QStringLiteral("A string with a \0 inside."));
qDebug() << "qStrL:" << qStrL << "length:" << qStrL.size();
}
输出:
qBytes: "A string with a \x00 inside.\x00" length: 26
qStr0: "A string with a " length: 16
qStr1: "A string with a \u0000 inside.\u0000" length: 26
qStr2: "A string with a \u0000 inside.\u0000" length: 26
qStrL: "A string with a \u0000 inside." length: 25

关于qt - QString 和嵌入的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62667815/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com