web-dev-qa-db-fra.com

QByteArray to QString

J'ai des problèmes avec QByteArray et QString.

Je lis un fichier et stocke ses informations dans une QByteArray. Le fichier est en unicode, il contient donc quelque chose comme: t\0 e\0 s\0 t\0 \0 \0

J'essaie de comparer cette valeur à la valeur spécifiée, mais elle échoue car, dans le débogueur, je vois que ce n'est pas une chaîne unicode.

Le code expliquera tout:

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.

Dans le débogueur, cela me montre que la variable Data a pour valeur "t\0 e\0 s\0 t\0 \0 \0" et que myValue a pour valeur "test". Comment puis-je le réparer?

28
Nika

Vous pouvez utiliser QTextCodec pour convertir le bytearray en chaîne:

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

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

Dans votre exemple, nous pouvons voir que la chaîne "test" est codée sous la forme "t\0 e\0 s\0 t\0 \0 \0" dans votre codage, c’est-à-dire que chaque caractère ascii est suivi d’un \0-octet, ou resp. chaque caractère ascii est codé sur 2 octets. Les seuls codages Unicode dans lesquels les lettres ASCII sont codées de cette manière sont UTF-16 ou UCS-2 (qui est une version restreinte de UTF-16). Dans votre cas, le 1015 mib est donc nécessaire identique à l’endianess d’entrée).

23
BeniBela

vous pouvez utiliser QString::fromAscii()

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

avec data() renvoyant un char*

pour QT5, vous devriez plutôt utiliser fromCString(), car fromAscii() est obsolète, voir https://bugreports.qt-project.org/browse/QTBUG-21872 https://bugreports.qt.io/browse/QTBUG-21872

10
octoback

Vous pouvez utiliser:

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

On peut trouver QString :: fromUtf8 () aussi utile.

Pour QByteArray input de "\010" et "\000", QString :: fromLocal8Bit (entrée, 1) a retourné "\010" et "", mais QString :: fromUtf8 (entrée, 1) a renvoyé correctement "\010" et "\000".

3
Efreeto

Utilisez QString::fromUtf16((ushort *)Data.data()), comme indiqué dans l'exemple de code suivant:

#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();
}

C'est une solution alternative à celle utilisant QTextCodec. Le code a été testé avec Qt 5.4.

2
jonathanzh

Vous pouvez utiliser ce constructeur QString pour la conversion de QByteArray en QString: 

QString (const QByteArray & ba)

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