Подтвердить что ты не робот

QByteArray - QString

У меня проблемы с QByteArray и QString.

Я читаю файл и сохраняю его информацию в QByteArray. Файл находится в юникоде, поэтому он содержит что-то вроде: t\0 e\0 s\0 t\0 \0 \0

Я пытаюсь сравнить это значение с моим указанным значением, но он терпит неудачу, потому что в отладчике я вижу это не строку юникода.

Код объяснит все:

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.

В отладчике это показывает мне, что переменная Data имеет значение "t\0 e\0 s\0 t\0 \0 \0" и myValue имеет значение "test". Как я могу это исправить?

4b9b3361

Ответ 1

Вы можете использовать QTextCodec, чтобы преобразовать bytearray в строку:

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

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

Из вашего примера видно, что строка "test" кодируется как "t\0 e\0 s\0 t\0 \0 \0" в вашей кодировке, т.е. за каждым символом ascii следует \0 -byte, или соответственно. каждый символ ascii кодируется как 2 байта. Единственная кодировка в кодировке Юникода, в которой закодированы буквы ascii, - это UTF-16 или UCS-2 (которая является ограниченной версией UTF-16), поэтому в вашем случае требуется 1015 mib (если ваша локальная endianess является так же, как и входная консистенция).

Ответ 3

Ты можешь использовать:

QString::fromStdString(byteArray.toStdString())

Ответ 4

Вы можете использовать этот конструктор QString для преобразования из QByteArray в QString:

QString (const QByteArray & ba)

QByteArray data;
QString DataAsString = QString(data);

Ответ 6

Используйте QString::fromUtf16((ushort *)Data.data()), как показано в следующем примере кода:

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

Это альтернативное решение, использующее QTextCodec. Код был протестирован с использованием Qt 5.4.

Ответ 7

Я использую следующее

примечание: значение равно const QByteArray & amp;

    auto data = reinterpret_cast<const quint8 *>(value.constData());
    QString ip;
    for (int i=0; i<value.size()-1; i++)
    {   ip=ip+data[i];
    }

Ответ 8

QString a = "test";
QByteArray a1 = a.toUtf8();
QString backToString = a1;

Ответ 9

Вы можете использовать:

QString DataAsString = data.trimmed();

Данные являются QByteArray.