我在QJsonValue
中有一个大的(兆字节)字符串,我需要将其转换为QByteArray
,因为我将字符串作为带有QNetworkRequest
的数据发送。
目前我这样做:
myQJsonObject["myQJsonValue"].toString().toUtf8()
由于某种原因,这会导致多次将相同的数据复制到内存中吗?如果是这样,如果没有不必要的复制,你会如何实现呢?
答案 0 :(得分:4)
以及为什么不使用QJsonDocument
?这应该用于阅读和写作。方法QJsonDocument::toBinaryData。
这个API应该以最有效的方式完成所有事情。
单个JSon值必须是其他JSon类型之一:object,string或某个数字。我很确定你有JSon对象。 所以你的代码看起来像这样::
JSonValue val = someJsond["someKey"];
if (val.isObject()) {
QJSonDocument doc(val.toObject());
SendToServer(doc.toBinaryData());
} else {
// error or:
SendToServer(val.toString().toUtf8());
}
答案 1 :(得分:1)
由于Qt的写时复制语义,对myQJsonObject["myQJsonValue"].toString()
的调用不涉及数据复制。
toUtf8
电话费用很高。 QString
将数据存储为Unicode(16位QChar
s),并将其编码为UTF-8不仅仅涉及数据复制。
QString::constData()
返回指向底层字符数组的指针。但是,在Utf-8的情况下,每个字符由2个字节而不是1或2个字节表示。这可能意味着通过网络发送两倍以上的数据。
因此,如果您的数据主要由ASCII字符组成,那么UTF-8可能是更好的选择。如果它包含许多非Ascii字符,而另一方可以处理UTF-16,则UTF-16值得考虑。