50

我遇到了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.

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

4

7 回答 7

40

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

QString(const QByteArray &ba)

QByteArray data;
QString DataAsString = QString(data);
于 2019-01-11T23:07:54.783 回答
29

您可以使用QTextCodec将字节数组转换为字符串:

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 或 resp。每个 ascii 字符都被编码为 2 个字节。以这种方式编码 ascii 字母的唯一 unicode 编码是 UTF-16 或 UCS-2(这是 UTF-16 的受限版本),因此在您的情况下需要 1015 mib(假设您的本地字节序是与输入字节序相同)。

于 2013-01-03T00:05:53.010 回答
28

您可以使用:

QString::fromStdString(byteArray.toStdString())
于 2017-12-08T11:54:20.887 回答
14

您可以使用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

于 2013-11-13T13:25:42.873 回答
9

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

对于和, QByteArray input_"\010""\000"

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

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

于 2016-07-22T15:59:37.260 回答
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();
}

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

于 2015-05-28T01:00:02.493 回答
0

Qt 5.12 及更高版本:

QString::fromStdString(byteArray.toStdString());
于 2020-03-04T12:04:37.883 回答