通过qDebug打印qByteArray


#include <QCoreApplication>
#include <QByteArray>
#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QByteArray dataReceivedFromSerialPort;
    dataReceivedFromSerialPort.push_back(0x0A);
    dataReceivedFromSerialPort.push_back(0x0B);
    dataReceivedFromSerialPort.push_back(0x0C);
    dataReceivedFromSerialPort.push_back(0x0D);
    dataReceivedFromSerialPort.push_back(0x0E);
    dataReceivedFromSerialPort.push_back(0x0F);
    dataReceivedFromSerialPort.push_back(0x07);
    dataReceivedFromSerialPort.push_back(0x02);
    dataReceivedFromSerialPort.push_back(0x01);
    dataReceivedFromSerialPort.push_back(0x02);
    qDebug() << "tostr: " << dataReceivedFromSerialPort.toStdString().c_str();

    return a.exec();
}

上面没有打印任何值。除了"tostr:"之外,它不会打印任何内容。如果我在uchar中存储0x0A,然后在qByteArray中推送它,那么这个问题就会消失。

如何将其打印为当前形式?

因为在许多编码中,您给出的字节是各种控制字符(换行符、回车符等(。经过std::stringchar*意味着字节将按原样发送到终端,并以这种方式显示(要么根本不显示,要么显示为各种类型的空白(。

你可以试着做其中一个,这取决于你想要什么:

qDebug() << dataFromSerialPort; // prints "nx0Bfrx0Ex0Fx07x02x01x02"
qDebug() << QString::fromLatin1(dataFromSerialPort); // prints "nu000Bfru000Eu000Fu0007u0002u0001u0002"
qDebug() << dataFromSerialPort.toHex(); // "0a0b0c0d0e0f07020102"
qDebug() << qPrintable(dataFromSerialPort); // same as toStdString().c_str(), but IMO more readable.

这些以各种转义序列打印字节(QString使用unicode,这就是为什么您在那里看到\u而不是\x(,作为可读的十六进制表示形式以及"原样"。

QDebug对许多已知的类型进行特殊格式化,如QString和QByteArray,这就是为什么上面的前三个例子用引号打印并写出转义序列(毕竟是为了调试(。qPrintable的工作原理与toStdString().c_str()非常相似,它返回一个char*,QDebug不会以任何特殊的方式对其进行格式化,这就是为什么您将空白作为输出(这与std::cout和friends的行为相同(。

相关内容

  • 没有找到相关文章

最新更新