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"
. Как я могу это исправить?
Ответы
Ответ 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 является так же, как и входная консистенция).
Ответ 2
Вы можете использовать QString::fromAscii()
QByteArray data = entity->getData();
QString s_data = QString::fromAscii(data.data());
с data()
возвращающим char*
для QT5 вместо этого следует использовать fromCString()
, так как fromAscii()
устарела, см. https://bugreports.qt-project.org/browse/QTBUG-21872 https://bugreports.qt.io/browse/QTBUG-21872
Ответ 3
Ты можешь использовать:
QString::fromStdString(byteArray.toStdString())
Ответ 4
Вы можете использовать этот конструктор QString для преобразования из QByteArray в QString:
QString (const QByteArray & ba)
QByteArray data;
QString DataAsString = QString(data);
Ответ 5
Можно найти QString:: fromUtf8() также полезно.
Для QByteArray input
от "\010"
и "\000"
,
QString:: fromLocal8Bit (ввод, 1) вернул "\010"
и ""
, но QString:: fromUtf8 (input, 1) правильно вернул "\010"
и "\000"
.
Ответ 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.