QByteArray到QString

Nik*_*ika 35 c++ qstring qt qbytearray qtcore

QByteArray和他有问题QString.

我正在读取文件并将其信息存储在一个文件中QByteArray.该文件是unicode,因此它包含以下内容:t\0 e\0 s\0 t\0 \0 \0

我试图将此值与我的指定值进行比较,但它失败了,因为在调试器中我看到它不是unicode字符串.

代码将解释一切:

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.
Run Code Online (Sandbox Code Playgroud)

在调试器中,它向我显示变量Data具有值"t\0 e\0 s\0 t\0 \0 \0"myValue具有值"test".我该如何解决?

Ben*_*ela 26

您可以使用QTextCodec将bytearray转换为字符串:

QString DataAsString = QTextCodec::codecForMib(1015)->toUnicode(Data);
Run Code Online (Sandbox Code Playgroud)

(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字节,或RESP.每个ascii字符编码为2个字节.ascii字母以这种方式编码的唯一unicode编码是UTF-16或UCS-2(UTF-16的限制版本),所以在你的情况下需要1015 mib(假设你的本地字节是与输入endianess相同).

  • 不知道为什么这是一个如此高的答复。这提供了大多数人应该使用的不寻常的解决方案。将其与常规转换方法一起提供将是一个不错的答复,但是就其本身而言,这很奇怪。 (2认同)

小智 15

您可以使用:

QString::fromStdString(byteArray.toStdString())
Run Code Online (Sandbox Code Playgroud)


kir*_*off 14

您可以使用 QString::fromAscii()

QByteArray data = entity->getData();
QString s_data = QString::fromAscii(data.data());
Run Code Online (Sandbox Code Playgroud)

data()返回char*

对于QT5,您应该使用fromCString(),fromAscii()不推荐使用,请参阅https://bugreports.qt-project.org/browse/QTBUG-21872 https://bugreports.qt.io/browse/QTBUG-21872

  • *在Qt 5中弃用了Ascii()!请_not_使用它. (7认同)
  • 实际上他不能使用任何这个,因为他想转换utf-16,而不是ascii (2认同)
  • 我似乎找不到`fromCString()`,您的意思是(还是自Q / A以来将其重命名的方法)为[`fromCFString()`](http://doc.qt.io/qt-5 /qstring.html#fromCFString)吗? (2认同)

Efr*_*eto 9

您可能会发现QString::fromUtf8()也很有用。

对于QByteArray input"\010""\000"

QString::fromLocal8Bit(input, 1)返回"\010"""

QString::fromUtf8(input, 1)正确返回"\010""\000"


小智 8

您可以使用以下QString构造函数将QByteArray转换为QString:

QString(const QByteArray&ba)

QByteArray data;
QString DataAsString = QString(data);
Run Code Online (Sandbox Code Playgroud)


jon*_*nzh 5

使用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();
}
Run Code Online (Sandbox Code Playgroud)

这是使用 QTextCodec 的替代解决方案。该代码已使用 Qt 5.4 进行了测试。