c++ - QByteArray a QString
qt qtcore (7)
Tengo problemas con QByteArray
y QString
.
Estoy leyendo un archivo y almacena su información en un QByteArray
. El archivo está en Unicode, por lo que contiene algo así como: t/0 e/0 s/0 t/0 /0 /0
Estoy tratando de comparar este valor con mi valor especificado, pero falla, porque en el depurador veo que no es una cadena unicode.
El código explicará todo:
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.
En el depurador, me muestra que la variable Data
tiene el valor "t/0 e/0 s/0 t/0 /0 /0"
y myValue
tiene el valor "test"
. ¿Cómo puedo arreglarlo?
Puede usar QTextCodec para convertir el bytearray en una cadena:
QString DataAsString = QTextCodec::codecForMib(1015)->toUnicode(Data);
(1015 es UTF-16, 1014 UTF-16LE, 1013 UTF-16BE, 106 UTF-8)
De su ejemplo, podemos ver que la cadena "test"
está codificada como "t/0 e/0 s/0 t/0 /0 /0"
en su codificación, es decir, cada carácter ascii va seguido de un /0
-byte, o resp. cada carácter ascii está codificado como 2 bytes. La única codificación Unicode en la que las letras ascii están codificadas de esta manera, son UTF-16 o UCS-2 (que es una versión restringida de UTF-16), por lo que en su caso se necesita 1015 mib (suponiendo que su endianess local es la lo mismo que la entrada endianess).
Puedes usar:
QString DataAsString = data.trimmed();
Los datos son un QByteArray.
Puedes usar:
QString::fromStdString(byteArray.toStdString())
Uno puede encontrar que QString::fromUtf8() también es útil.
Para la QByteArray input
de "/010"
y "/000"
, QString :: fromLocal8Bit (entrada, 1) devolvió "/010"
y ""
, pero QString::fromUtf8() devolvió correctamente "/010"
y "/000"
.
Utilice QString::fromUtf16((ushort *)Data.data())
, como se muestra en el siguiente ejemplo de código:
#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();
}
Esta es una solución alternativa a la que usa QTextCodec. El código ha sido probado usando Qt 5.4.
puedes usar QString::fromAscii()
QByteArray data = entity->getData();
QString s_data = QString::fromAscii(data.data());
con data()
devolviendo un char*
para QT5, debe usar fromCString()
lugar, ya que fromAscii()
está en desuso, consulte https://bugreports.qt-project.org/browse/QTBUG-21872 https://bugreports.qt.io/browse/QTBUG-21872
QString a = "test";
QByteArray a1 = a.toUtf8();
QString backToString = a1;