23

I am trying to display a number using QDebug in the Hex format. Below is the code which I have written. It is working but the output has string contents enclosed in double quotes:

How to remove these quotes?

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;

I did as per these resources:

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

enter image description here

parsley72
  • 8,449
  • 8
  • 65
  • 98
Katoch
  • 2,709
  • 9
  • 51
  • 84

11 Answers11

40

The solution is simple:

#include <QDebug>

int value = 0x12345;
qDebug() << "Value : " << hex << value;
  • 1
    "Furthermore, QTextStream manipulators can be piped into a QDebug stream." -- http://doc.qt.io/qt-5/qdebug.html#formatting-options – Mihayl Apr 13 '18 at 06:48
  • 1
    [QTextStream also defines several global manipulator functions](http://doc.qt.io/qt-5/qtextstream.html#qtextstream-manipulators) – Mihayl Apr 13 '18 at 11:01
  • It should be noted that if the value is a char, this will not work, but can be easily resolved by casting the char to an int which then makes it work. – Xofo Sep 12 '19 at 23:59
  • 9
    As of Qt 5.14, `hex` is exposed through the Qt namespace, `Qt::hex`, and you can use it with and without the `Qt::` prefix. As of Qt 5.15, `hex` is deprecated and `Qt::hex` is the preferred usage. – pixelgrease Jul 09 '20 at 16:51
  • 6
    To show the `0x` prefix, use `Qt::hex << Qt::showbase << your_value` – smac89 Dec 26 '20 at 07:23
27

You could format string first:

int myValue = 0x1234;
QString valueInHex= QString("%1").arg(myValue , 0, 16);
qDebug() << "value = " << valueInHex;
StephBel
  • 337
  • 3
  • 8
13

Another way of doing this would be:

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

Hope this helps.

Edit: To remove the quotes you can cast the number as a pointer, as qt will format that without using quotes. For instance:

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

Slightly hackish, but it works.

TheDancinZerg
  • 141
  • 1
  • 7
  • +1 for being more efficient than `qDebug() << QByteArray(...)` (that produces a QString internally), but this too does not answer OP's question on how to get rid of the quotes. – Adrian W Feb 01 '16 at 14:43
  • I must have missed that, I updated my answer with something that will remove quotes. – TheDancinZerg Feb 01 '16 at 21:22
  • 3
    Use noquote(), as in: qDebug().noquote() << QString::number(value, 16); – pixelgrease Sep 06 '16 at 21:03
7

qDebug is a debug interface. It's not meant for custom-formatted output, it's simply a way of quickly getting data in readable form. It's meant for a developer, and the quotes are there to remind you that you've output a string. qDebug() presumes that the const char* data is a message and shows it without quotes, other string types like QString are "just data" and are shown with quotes.

If you want custom formatting, don't use qDebug(), use QTextStream:

#include <QTextStream>
#include <cstdio>

QTextStream out(stdout);

void f() {
   out << "Heart-Beat : Msg ID = " << MessageID << "  Msg DLC = " << DataSize << endl;
}
Kuba hasn't forgotten Monica
  • 95,931
  • 16
  • 151
  • 313
  • Completeness it might be good to add: out << std::hex << MessageID << ... – Xofo Apr 02 '19 at 20:40
  • 1
    `out` is not an `std::ostream`, so `std::hex` won’t compile. But `hex` all by itself will (it’s Qt’s, not `std`’s). – Kuba hasn't forgotten Monica Apr 04 '19 at 11:24
  • The correct(?) way in Qt is `Qt::hex(out) << number;` or even `Qt::showBase(Qt::hex(out)) << number;` Or, for better readability IMHO: `Qt::showbase(Qt::uppercasedigits(Qt::hex(out))) << number;` – Jesse Chisholm Jun 07 '20 at 02:31
  • Sadly, to get what want, I needed: `out << "0x" << QString("%1").arg(number, 8, 16, QLatin1Char('0')).toUpper();` Which just looks ugly. But it seems the simplest that gives me the same as `printf("0x%08X", number);` – Jesse Chisholm Jun 07 '20 at 02:48
  • 1
    @JesseChisholm Unfortunately, "streaming" string formatting was a failed STL experiment. Modern string fromatting eschews that old interface, and comes back to printf-like API in modern C++. But that's not in Qt yet. – Kuba hasn't forgotten Monica Jun 07 '20 at 15:47
  • @UnslanderMonica I suppose this would be always a point of debate (also, new interface is nothing like printf). The problem of format string output is its fragility to usage, portability OR high cost, choose two of those. Problem of stl-like implementation was its annoying "I toggle it once and untoggle after" approach to output modes, but supposedly it had to generate a compile time , static sequence of operations upon stream, no excess memory allocation, stack crawling and parsing a string, no dependency on the actual types of arguments changing from platform to platform. – Swift - Friday Pie Dec 01 '20 at 14:02
6

If one is not tied to use streaming operators, can go with the plain old %x and use qDebug with formatting string:

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

which will yield "My hex number is: 56", without quotes.

zgyarmati
  • 1,135
  • 8
  • 15
4
qDebug() << QByteArray::number(myNumber).toHex()
eyllanesc
  • 235,170
  • 19
  • 170
  • 241
Kirill Gamazkov
  • 3,277
  • 1
  • 18
  • 22
  • This does not remove the quotes as asked. Also, this produces more internal overhead than necessary: QByteArray::number(myNumber) creates a QByteArray with the decimal representation which then needs a second step for converting to hex. Suggested improvement: `qDebug() << QByteArray::number(myNumber,16)`. – Adrian W Feb 01 '16 at 14:47
3

Use noquote() to avoid the quotation marks. As in:

qDebug().noquote() << QString::number(value, 16);
pixelgrease
  • 1,940
  • 23
  • 26
2

May be a little late, but in case someone needs this:

As statet in the answere by Kuber Ober, Qt only removes the quotes if it's a const char * passed to qDebug. However, Qt provides a macro to do the same with a QString - The qPrintable macro:

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

This way, you can use the QString::number function (as provided by TheDancinZerg) to format the string:

int value = 0xFFFF;
qDebug() << qPrintable(QString::number(value, 16));
Felix
  • 6,885
  • 1
  • 29
  • 54
1
int value = 0xff005542;
qDebug() << QString("%1").arg(value , 0, 16).toUpper();

>>> FF005542

That'll give you hex output at whatever length is required. But if you'd like fixed width output, this is handy (example of four hex digits):

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

>>> 00FF

fyngyrz
  • 2,458
  • 2
  • 36
  • 43
0

Just a note! The method using <<hex is deprecieted now, so it's recommended to use:


#include <QDebug>

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

Because, if you compile this way just using <<hex you will got some warnings, what means that soon this form to write will not be compatible anymore. For more infos take a look at Qt documentation

Lincoln
  • 53
  • 6
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Feb 12 '22 at 06:35
0

This is why you want to learn C before C++ & Qt:

qDebug("Data for test case 1: 0x%04X", crc)

Done, always works. No extra spaces, no extra quotes, no extra .noquote or << or ::hex or .toUpper etc.

Friedrich
  • 2,011
  • 2
  • 17
  • 19