QByteArray to QString

136,859

Solution 1

You can use QTextCodec to convert the bytearray to a string:

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

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

From your example we can see that the string "test" is encoded as "t\0 e\0 s\0 t\0 \0 \0" in your encoding, i.e. every ascii character is followed by a \0-byte, or resp. every ascii character is encoded as 2 bytes. The only unicode encoding in which ascii letters are encoded in this way, are UTF-16 or UCS-2 (which is a restricted version of UTF-16), so in your case the 1015 mib is needed (assuming your local endianess is the same as the input endianess).

Solution 2

You can use this QString constructor for conversion from QByteArray to QString:

QString(const QByteArray &ba)

QByteArray data;
QString DataAsString = QString(data);

Solution 3

You can use:

QString::fromStdString(byteArray.toStdString())

Solution 4

you can use QString::fromAscii()

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

with data() returning a char*

for QT5, you should use fromCString() instead, as fromAscii() is deprecated, see https://bugreports.qt-project.org/browse/QTBUG-21872 https://bugreports.qt.io/browse/QTBUG-21872

Solution 5

You may find QString::fromUtf8() also useful.

For QByteArray input of "\010" and "\000",

QString::fromLocal8Bit(input, 1) returns "\010" and ""

QString::fromUtf8(input, 1) correctly returns "\010" and "\000".

Share:
136,859
Nika
Author by

Nika

Updated on January 04, 2022

Comments

  • Nika
    Nika 12 months

    I'm having issues with QByteArray and QString.

    I'm reading a file and stores its information in a QByteArray. The file is in unicode, so it contains something like: t\0 e\0 s\0 t\0 \0 \0

    I'm trying to compare this value to my specified value, but it fails, because in the debugger I see it's not an unicode string.

    The code will explain everything:

    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.
    

    In the debugger, it shows me that the variable Data has the value "t\0 e\0 s\0 t\0 \0 \0" and myValue has the value "test". How can I fix it?

  • László Papp
    László Papp about 9 years
    *Ascii() is deprecated in Qt 5! Do not use it.
  • László Papp
    László Papp about 9 years
    Not sure why this is a so upvoted reply. This is giving an unusual solution that the majority uses and should use. Providing it alongside the usual conversion methods would have been a good reply, but on its own, it is strange.
  • BeniBela
    BeniBela about 9 years
    Actually he can not use any of this, because he wants to convert utf-16, not ascii
  • BeniBela
    BeniBela about 9 years
    @LaszloPapp: Do you mean QString::fromUTf16? That takes a ushort pointer, which would require some very ugly casting to pass a QByteArray
  • László Papp
    László Papp about 9 years
    @BeniBela: yes, but why cannot it be utf8? In which case why not suggest from/toUtf8()?
  • BeniBela
    BeniBela about 9 years
    @LaszloPapp: Because of the example. He wants to convert t\0e\0s\0t\0 to test. If it were utf-8, there would be no \0-bytes
  • László Papp
    László Papp about 9 years
    @BeniBela: OK, fair enough. Can you make this clear in your answer why you suggest utf16? As you can see, it was a bit unclear for me. You will also get a few more upvotes with the bumping of the thread. :)
  • ssc
    ssc over 7 years
    I can't seem to find fromCString(), did you mean (or was the method renamed since the Q / A) to fromCFString() ?
  • iyasar
    iyasar over 6 years
    No actually use fromLatin1 instead of fromAscii
  • TSG
    TSG over 1 year
    This should be the accepted answer. Functional and simpler (let Qt handle conversion automatically)