Qt C ++从QJsonValue转换为QByteArray

时间:2016-02-19 21:08:22

标签: c++ qt

我在QJsonValue中有一个大的(兆字节)字符串,我需要将其转换为QByteArray,因为我将字符串作为带有QNetworkRequest的数据发送。

目前我这样做:

myQJsonObject["myQJsonValue"].toString().toUtf8()

由于某种原因,这会导致多次将相同的数据复制到内存中吗?如果是这样,如果没有不必要的复制,你会如何实现呢?

2 个答案:

答案 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值得考虑。