it-swarm.com.de

QByteArray zu QString

Ich habe Probleme mit QByteArray und QString.

Ich lese eine Datei und speichert ihre Informationen in einer QByteArray. Die Datei befindet sich im Unicode-Format und enthält daher etwa Folgendes: t\0 e\0 s\0 t\0 \0 \0

Ich versuche, diesen Wert mit meinem angegebenen Wert zu vergleichen, schlägt jedoch fehl, da im Debugger keine Unicode-Zeichenfolge angezeigt wird.

Der Code wird alles erklären:

QByteArray Data; //contains unicode string "t\0 e\0 s\0 t\0 \0 \0"
QString myValue = "test"; //value to compare.
if(Data.contains(myValue))
    //do some stuff.
else
    //do other stuff.

Im Debugger wird angezeigt, dass die Variable Data den Wert "t\0 e\0 s\0 t\0 \0 \0" und myValue den Wert "test" hat. Wie kann ich es reparieren?

28
Nika

Sie können QTextCodec verwenden, um den Bytearray in einen String zu konvertieren:

QString DataAsString = QTextCodec::codecForMib(1015)->toUnicode(Data);

(1015 ist UTF-16, 1014 UTF-16LE, 1013 UTF-16BE, 106 UTF-8)

In Ihrem Beispiel können Sie sehen, dass die Zeichenfolge "test" in Ihrer Codierung als "t\0 e\0 s\0 t\0 \0 \0" codiert ist, d. H. Auf jedes ASCII-Zeichen folgt ein \0-Byte. Jedes ASCII-Zeichen wird als 2 Byte codiert. Die einzige Unicode-Codierung, bei der ASCII-Buchstaben auf diese Weise codiert werden, ist UTF-16 oder UCS-2 (eine eingeschränkte Version von UTF-16). In diesem Fall ist die 1015-Mib erforderlich wie bei der Eingabe endianess).

23
BeniBela

sie können QString::fromAscii() verwenden

QByteArray data = entity->getData();
QString s_data = QString::fromAscii(data.data());

mit data() einen char* zurückgeben

für QT5 sollten Sie stattdessen fromCString() verwenden, da fromAscii() veraltet ist, siehe https://bugreports.qt-project.org/browse/QTBUG-21872 https://bugreports.qt.io/browse/QTBUG-21872

10
octoback

Sie können verwenden:

QString::fromStdString(byteArray.toStdString())
5
Tarek.Mh

QString :: fromUtf8 () kann ebenfalls nützlich sein.

Für QByteArray input von "\010" und "\000" wird QString :: fromLocal8Bit (Eingabe 1) zurückgegeben "\010" und "", aber QString :: fromUtf8 (Eingabe 1) wird "\010" und "\000" korrekt zurückgegeben.

3
Efreeto

Verwenden Sie QString::fromUtf16((ushort *)Data.data()) wie im folgenden Codebeispiel gezeigt:

#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // QByteArray to QString
    // =====================

    const char c_test[10] = {'t', '\0', 'e', '\0', 's', '\0', 't', '\0', '\0', '\0'};
    QByteArray qba_test(QByteArray::fromRawData(c_test, 10));
    qDebug().nospace().noquote() << "qba_test[" << qba_test << "]"; // Should see: qba_test[t

    QString qstr_test = QString::fromUtf16((ushort *)qba_test.data());
    qDebug().nospace().noquote() << "qstr_test[" << qstr_test << "]"; // Should see: qstr_test[test]

    return a.exec();
}

Dies ist eine alternative Lösung zu der, die QTextCodec verwendet. Der Code wurde mit Qt 5.4 getestet.

2
jonathanzh

Sie können diesen QString-Konstruktor für die Konvertierung von QByteArray in QString verwenden: 

QString (const QByteArray & ba)

QByteArray data;
QString DataAsString = QString(data);
1
Link H.