Как получить символы ASCII из шестнадцатеричных значений, содержащихся в QString? - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть QString , содержащая многократные шестнадцатеричные значения от 0x00 до 0xFF. Я получаю строку из 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 голосов
/ 11 сентября 2018

Вы можете разделить пробелы и преобразовать каждую подстроку, используя 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+¯ → ª
0 голосов
/ 11 сентября 2018

Вам нужно что-то вроде

    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».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...