如何从QString中包含的十六进制值中获取ASCII字符?

时间:2018-09-11 08:12:05

标签: c++ qt

我有一个 QString ,其中包含从0x000xFF的多进制十六进制值。 我从 QTableWidget 获得了字符串,我想将其中的十六进制值转换为其相应的ASCII字符,即0xAA => ª0xFF = > ÿ等。结果应显示在 QTextEdit 中。

这是一个最小的例子:

#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString asciiAsQString = "0x4A 0x3B 0x1F 0x0D";
    qDebug() << "hex as qstring." << asciiAsQString;
    QString f;

    for(int i = 0; i < asciiAsQString.length(); i++)
    {
        f.append(QChar(asciiAsQString.at(i).toLatin1()));
    }
    qDebug() << "ascii of hex contained in qString:" << f;
    return a.exec();
}

我已经尝试过这种方法和一些类似的方法,但是没有任何效果如我所料。

如何修复代码以获得所需的结果?

2 个答案:

答案 0 :(得分:2)

您需要类似的东西

    QString asciiAsQString = "0x4A 0x3B 0x1F 0x0D";
    // You may need a bit of error checking to ensure the string is the right
    // format here.
    asciiAsQString.replace("0x", "").replace(" ","");  // Remove '0x' and ' '
    const QByteArray hex = asciiAsQString.toLatin1();
    const QByteArray chars = hex.fromHex();
    const QString text = chars.fromUtf8();

取决于期望用户输入的编码,最后一行应为.fromLatin1().fromLocal8Bit()。我鼓励您允许Utf8,因为它允许使用全部Unicode。这确实意味着需要将“ª”输入为“ C2 AA”,但可以将“提”输入为“ E6 8F 90”。

答案 1 :(得分:1)

您可以分割空格,并使用QString::toUShort()转换每个子字符串,如下所示:

#include <QDebug>

int main()
{
    QString input = "0x61 43 0xaf 0x20 0x2192 32 0xAA";
    qDebug() << "Hex chars:" << input;

    QString output;

    for (auto const& s: input.split(' ', QString::SkipEmptyParts))
    {
        bool ok;
        auto n = s.toUShort(&ok, 0);
        if (!ok) {
            qWarning() << "Conversion failure:" << s;
        } else {
            output.append(QChar{n});
        }
    } 
    qDebug() << "As characters:" << qPrintable(output);
}

输出:

Hex chars: "0x61 43 0xaf 0x20 0x2192 32 0xAA"
As characters: a+¯ → ª