将 QByteArray 转换为 char* 的问题

Posted

技术标签:

【中文标题】将 QByteArray 转换为 char* 的问题【英文标题】:Issue with conversion QByteArray to char* 【发布时间】:2020-12-11 11:52:45 【问题描述】:

我遇到了一个问题,在将QByteArray 转换为const char* 时我无法解释不是内联。这是一个例子:

QString string1("ABCDEFGHI");
const char* stringData1 = string1.toUtf8().constData();
qDebug() << "String:" << string1 << "\nbytearray:" << string1.toUtf8()
         << "\ndata immediate:" << string1.toUtf8().constData() << "\ndata stored:" << stringData1;

QString string2("ABCDEFGHJ");
const char* stringData2 = string2.toUtf8().constData();
qDebug() << "String:" << string2 << "\nbytearray:" << string2.toUtf8()
         << "\ndata immediate:" << string2.toUtf8().constData() << "\ndata stored:" << stringData2;

我得到以下输出:

String: "ABCDEFGHI" 
bytearray: "ABCDEFGHI" 
data immediate: ABCDEFGHI 
data stored: 

String: "ABCDEFGHJ" 
bytearray: "ABCDEFGHJ" 
data immediate: ABCDEFGHJ 
data stored: ABCDEFGHJ

data stored 的输出不能保证在 case 1 中是错误的,但在 case 2 中是正确的。我可以交换 case 1 和 case 2,结果将是相同的 - 在 case 1 中错误,但在 case 中正确2.

内联转换似乎工作得很好。

如果使用const char* 变量存储结果,您是否发现从QByteArrayconst char* 的转换有任何问题?

【问题讨论】:

您在QString::toUtf8 返回的临时 QByteArray 上调用QByteArray::constData。所以stringData1stringData2 是悬空指针:未定义的行为。 【参考方案1】:

toUtf8 返回一个对象,其生命周期在表达式末尾结束。constData 返回指向此临时对象的指针。 因此,您使用的是悬空指针并且行为未定义。

需要延长转换后字符串的生命周期:

QString string1("ABCDEFGHI");
QByteArray utfString = string1.toUtf8();
const char* stringData1 = utfString.constData();

【讨论】:

【参考方案2】:

此调用 string1.toUtf8().constData() 包含两个相应的调用:QString::toUtf8() 产生一个临时的 QByteArrayQByteArray::constData(),它返回一个指向临时对象的指针,该对象最终被销毁。

【讨论】:

【参考方案3】:

我以前获取 QString 变量的方式,将其转换为 QByteArray,最后 const char* 是这样的:

QString var1 = ui->lineEdit->text().toUtf8();
QByteArray ba = var1.toLocal8Bit();
const char *var1final = ba.data(); 

QString 的值由 Ui 收集,在 lineEdit 中。

【讨论】:

以上是关于将 QByteArray 转换为 char* 的问题的主要内容,如果未能解决你的问题,请参考以下文章

Qt char * 转QString

vs2013 提示无法从void转换为char

如何将char类型数组转换为unicode字符串

Qt每天一例14.char数组浅拷贝为QByteArray

QString和char*的相互转换

字符串怎么转换为unsigned char数组