【问题标题】:Qdebug display hex valueQdebug 显示十六进制值
【发布时间】:2013-10-21 22:39:00
【问题描述】:

我正在尝试使用 QDebug 以十六进制格式显示一个数字。下面是我写的代码。它正在工作,但输出的字符串内容用双引号括起来:

如何删除这些引号?

m_CanMsg_ptr->id = 0x720;
m_CanMsg_ptr->sizeData = 1;
m_CanMsg_ptr->data[0] = 0x05;

MessageID.setNum(m_CanMsg_ptr->id,16);
DataSize  = QString("%1").arg(m_CanMsg_ptr->sizeData, 0, 16);
data      = QString("%1").arg(m_CanMsg_ptr->data[0], 0, 16)

qDebug() << "Heart-Beat : Msg ID = " << MessageID << "  Msg DLC = " << DataSize;
qDebug() << "Msg Data " << " = " << data;

我按照这些资源做了:

http://forum.qt.io/topic/5003/moved-how-to-display-a-local-variable-in-hex-when-debugging-a-qt-app/2 http://qt.shoutwiki.com/wiki/Convert_hexadecimal_to_decimal_and_vice-versa_in_Qt

【问题讨论】:

  • 您是否尝试使用+ 运算符而不是&lt;&lt; 来连接字符串?
  • 试过了,但问题解决了一半..但是完整的字符串显示为引号..?如何删除此引号
  • 在将 后,我得到以下带引号的输出
  • 使用 qDebug().noquote() 删除引号

标签: qt qdebug


【解决方案1】:

使用noquote() 避免使用引号。如:

qDebug().noquote() << QString::number(value, 16);

【讨论】:

    【解决方案2】:
    int value = 0xff005542;
    qDebug() << QString("%1").arg(value , 0, 16).toUpper();
    

    >>> FF005542

    这将为您提供所需长度的十六进制输出。但是,如果您想要固定宽度的输出,这很方便(四个十六进制数字的示例):

    int value = 0xff;
    qDebug() << QString("%1").arg(value, 4, 16, (QChar)'0').toUpper();
    //      Here's the fixed field length⬆︎
    

    >>> 00FF

    【讨论】:

      【解决方案3】:
      qDebug() << QByteArray::number(myNumber).toHex()
      

      【讨论】:

      • 这不会按要求删除引号。此外,这会产生比必要更多的内部开销:QByteArray::number(myNumber) 创建一个具有十进制表示的 QByteArray,然后需要第二步转换为十六进制。建议改进:qDebug() &lt;&lt; QByteArray::number(myNumber,16).
      【解决方案4】:

      解决方法很简单:

      #include <QDebug>
      
      int value = 0x12345;
      qDebug() << "Value : " << hex << value;
      

      【讨论】:

      • “此外,QTextStream 操纵器可以通过管道传输到 QDebug 流中。” -- doc.qt.io/qt-5/qdebug.html#formatting-options
      • 需要注意的是,如果该值是一个字符,这将不起作用,但可以通过将字符转换为一个 int 来轻松解决。
      • 从 Qt 5.14 开始,hex 通过 Qt 命名空间 Qt::hex 公开,您可以使用或不使用 Qt:: 前缀。从 Qt 5.15 开始,hex 已弃用,Qt::hex 是首选用法。
      • 要显示0x 前缀,请使用Qt::hex &lt;&lt; Qt::showbase &lt;&lt; your_value
      【解决方案5】:

      如果不使用流式操作符,可以使用普通的旧 %x 并使用带有格式化字符串的 qDebug:

      int hexnum = 0x56;
      qDebug("My hex number is: %x", hexnum);
      

      这将产生“我的十六进制数是:56”,不带引号。

      【讨论】:

      • 仅供参考,这意味着 hexnum 未签名
      【解决方案6】:

      可能有点晚了,但如果有人需要这个:

      正如 Kuber Ober 在回答中所说,Qt 仅在将 const char * 传递给 qDebug 时删除引号。但是,Qt 提供了一个宏来对 QString 执行相同的操作 - qPrintable 宏:

      qDebug() << qPrintable(QString("String without quotes")) << QString("String with quotes");
      

      这样,您可以使用QString::number 函数(由TheDancinZerg 提供)来格式化字符串:

      int value = 0xFFFF;
      qDebug() << qPrintable(QString::number(value, 16));
      

      【讨论】:

        【解决方案7】:

        另一种方法是:

        int value = 0xFFFF;
        qDebug() << QString::number(value, 16);
        

        希望这会有所帮助。

        编辑: 要删除引号,您可以将数字转换为指针,因为 qt 将在不使用引号的情况下对其进行格式化。例如:

        int value = 0xFFFF;
        qDebug() << (void *) value;  
        

        有点hackish,但它有效。

        【讨论】:

        • +1 比qDebug() &lt;&lt; QByteArray(...) 更高效(在内部产生一个 QString),但这也不能回答 OP 关于如何去掉引号的问题。
        • 我一定是错过了,我更新了我的答案,删除了引号。
        • 使用noquote(),如:qDebug().noquote()
        【解决方案8】:

        你可以先格式化字符串:

        int myValue = 0x1234;
        QString valueInHex= QString("%1").arg(myValue , 0, 16);
        qDebug() << "value = " << valueInHex;
        

        【讨论】:

          【解决方案9】:

          qDebug 是一个调试接口。它不适用于自定义格式的输出,它只是一种以可读形式快速获取数据的方法。它是为开发人员准备的,引号是为了提醒您已经输出了一个字符串。 qDebug() 假定 const char* 数据是一条消息并且不带引号显示它,其他字符串类型如 QString 是“只是数据”并用引号显示。

          如果你想要自定义格式,不要使用qDebug(),使用QTextStream

          #include <QTextStream>
          #include <cstdio>
          
          QTextStream out(stdout);
          
          void f() {
             out << "Heart-Beat : Msg ID = " << MessageID << "  Msg DLC = " << DataSize << endl;
          }
          

          【讨论】:

          • 完整性最好添加:out
          • out 不是std::ostream,所以std::hex 不会编译。但是 hex 本身会(它是 Qt 的,而不是 std 的)。
          • Qt 中正确的(?)方式是 Qt::hex(out) &lt;&lt; number; 甚至是 Qt::showBase(Qt::hex(out)) &lt;&lt; number; 或者,为了更好的可读性恕我直言:Qt::showbase(Qt::uppercasedigits(Qt::hex(out))) &lt;&lt; number;
          • 可悲的是,为了得到想要的东西,我需要:out &lt;&lt; "0x" &lt;&lt; QString("%1").arg(number, 8, 16, QLatin1Char('0')).toUpper(); 这看起来很丑。但这似乎是最简单的,它给了我和printf("0x%08X", number);一样的感觉
          • @JesseChisholm 不幸的是,“流”字符串格式化是一个失败的 STL 实验。现代字符串 fromatting 避开了旧接口,并回到现代 C++ 中类似 printf 的 API。但这还没有在 Qt 中。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-26
          • 2014-10-12
          • 2014-03-11
          • 2014-12-20
          • 2023-04-02
          • 2012-04-21
          • 1970-01-01
          相关资源
          最近更新 更多