Qdebug显示十六进制值

23

我想使用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

输入图像描述


你尝试使用+操作符而非<<来拼接字符串了吗? - Sebastian Lange
尝试过了,但问题只解决了一半... 但完整的字符串仍然带有引号... 如何去掉这些引号? - Katoch
我将“<<”替换为“+”后,得到以下输出:“心跳:消息ID = 720 消息DLC = 1”。 - Katoch
2
您可以使用 qDebug().noquote() 命令来删除引号。 - David Casper
11个回答

40

解决方案很简单:

#include <QDebug>

int value = 0x12345;
qDebug() << "Value : " << hex << value;

1
此外,QTextStream 操纵符可以被导入到 QDebug 流中。 - Mihayl
1
QTextStream 还定义了几个全局操作符函数。 - Mihayl
需要注意的是,如果值是char类型,这种方法将不起作用,但可以通过将char强制转换为int来轻松解决这个问题。 - Xofo
9
从Qt 5.14开始,hex通过Qt命名空间 Qt::hex 进行公开,您可以使用带或不带 Qt:: 前缀的方式。从Qt 5.15开始,hex已被弃用,建议使用Qt::hex - pixelgrease
6
使用 Qt::hex << Qt::showbase << your_value 可以显示十六进制数值的前缀 0x - smac89

27

你可以先格式化字符串:

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

14

另一种方法是:

int value = 0xFFFF;
qDebug() << QString::number(value, 16);
希望这可以帮到你。
编辑: 要删除引号,你可以将数字强制转换为指针,因为qt会在不使用引号的情况下对其进行格式化。例如:
int value = 0xFFFF;
qDebug() << (void *) value;  

有点小技巧,但它能用。


+1 是比 qDebug() << QByteArray(...) 更高效的方式(它在内部生成一个 QString),但这仍然没有回答 OP 如何摆脱引号的问题。 - Adrian W
我可能错过了那个问题,我更新了我的答案,加入了一个可以删除引号的内容。 - TheDancinZerg
3
使用noquote(),例如:qDebug().noquote() << QString::number(value, 16); - pixelgrease

7
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 << std::hex << MessageID << ... - Xofo
1
“out” 不是一个 “std::ostream”,所以 “std::hex” 无法编译。但是单独使用 “hex” 就可以(它是 Qt 的,不是 “std”的)。 - Kuba hasn't forgotten Monica
在Qt中,正确的方式是 Qt::hex(out) << number; 或者甚至是 Qt::showBase(Qt::hex(out)) << number; 或者为了更好的可读性,在我看来:Qt::showbase(Qt::uppercasedigits(Qt::hex(out))) << number; - Jesse Chisholm
遗憾的是,为了得到我想要的,我需要使用以下代码:out << "0x" << QString("%1").arg(number, 8, 16, QLatin1Char('0')).toUpper(); 这看起来很丑陋。但它似乎是最简单的方法,可以给我与 printf("0x%08X", number); 相同的结果。 - Jesse Chisholm
1
很遗憾,"流式"字符串格式化是一个失败的STL实验。现代字符串格式化避免了旧接口,并在现代C++中回到类似printf的API。但这还没有在Qt中实现。 - Kuba hasn't forgotten Monica
@UnslanderMonica 我想这将永远是一个争论的焦点(而且,新接口根本不像printf)。格式化字符串输出的问题在于其对使用、可移植性或高成本的脆弱性,选择其中两个。STL类似实现的问题是其令人讨厌的“我切换一次然后取消切换”的输出模式,但据说它必须在流上生成编译时静态操作序列,没有多余的内存分配、堆栈爬升和解析字符串,也不依赖于从平台到平台实际参数类型的变化。 - Swift - Friday Pie

6
如果不想使用流操作符,可以使用老式的 %x 并使用带格式的字符串调用 qDebug:
int hexnum = 0x56;
qDebug("My hex number is: %x", hexnum);

这将产生"My hex number is: 56",不带引号。

FYI,这意味着hexnum是无符号的。 - Mikhail

4
qDebug() << QByteArray::number(myNumber).toHex()

这不会去掉引号,也会产生比必要更多的内部开销:QByteArray::number(myNumber) 创建一个带有十进制表示的 QByteArray,然后需要第二步转换为十六进制。建议改进:qDebug() << QByteArray::number(myNumber,16) - Adrian W

3
使用noquote()可以避免引号。例如:
qDebug().noquote() << QString::number(value, 16);

2

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

正如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));

1
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


0

注意!使用<<hex方法已经过时,建议使用以下方法:


#include <QDebug>

int num = 0x4321;
qDebug() << "Hex num: " <<Qt::hex << num;

因为如果您只使用<<hex这种方式编译,您会得到一些警告,这意味着很快这种写法将不再兼容。欲了解更多信息,请查看Qt文档


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接