【问题标题】:Handling ASCII characters in a char to QString conversion处理 char 中的 ASCII 字符到 QString 的转换
【发布时间】:2017-01-24 07:31:35
【问题描述】:

我在将 char 转换为 QString 时遇到了一些麻烦,因为它一直在转储 ASCII 字符,而不是我想要的十六进制字节形式的总和(例如ffd0)。


对我所拥有的代码进行一些浏览 - 我有一个十六进制值字符串 (A1-B2-C3),它位于 QByteArray 中,并由我创建的 checkSum 函数进行操作。输出是一个校验和字节(ffd0),它在终端上正确打印为printf("%x", checkSum(output)); 但是当我使用 Qt 的 ui 功能时,它会打印出垃圾。

在 Qt Creator 上执行此操作的最有效方法是什么?


这里有一些额外的说明:

输入:

A1-B2-C3

输出:

标签 - “￐”(无意义的 ascii,有时还有偶尔出现的片假名和平假名,完全取决于输入的十六进制)

printf - ffd0(这是正确的输出,我想设置为标签和 lineEdit 的文本)


代码位:

char MainWindow::checkSum(QByteArray &b)
{
    char val = 0x00;
    char i;
    foreach (i, b)
    {
       val ^= i;
    }

    return val;
}

...

 QChar resultCh =  checkSum(output);

        ui->lineEdit->setText(resultCh);
        ui->outputLabel->setText(resultCh);

        printf("%x\n", resultCh);
...

【问题讨论】:

  • 问题是您的 checkSum 并不是一个真正的字符。它是一个 8 位长的有符号整数。您需要将该有符号整数转换为文本字符串 - 不要将其视为 Unicode 字符(这就是您目前正在做的事情)。

标签: c++ qt type-conversion ascii non-ascii-characters


【解决方案1】:

正确的结果不是ffd0,而是d0

为什么要将char 复制到QChar? 如果出于某种原因,您仍想这样做,则应在使用前将其转换为 unicode 值:

printf("%x", resultCh.unicode());

和:

ui->lineEdit->setText(QString("%1").arg(resultCh.unicode(), 0, 16));

注意printf("%x", resultCh); 应该在编译时给你一个很大的警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2014-01-16
    • 1970-01-01
    相关资源
    最近更新 更多