0

想在消息中显示每个字符的十六进制(如果可能的话,简单的方法,我知道我可以遍历字符并做到这一点):

typedef struct{
    double dTime;
    char cMessage[11];
} typeCanMessage;

typeCanMessage cmMessage1 = {4.5, {0xd2, 0xf1, 0xe0, 0xf1, 0xf1, 0xf1, 0xf1, 0x23, 0x23, 0x23, 0x23}};

QMessageBox *msgBox = new QMessageBox(0);
msgBox->setGeometry(QRect(QPoint(200,200),QSize(400,400)));
msgBox->setInformativeText(QString::number(cmMessage1.dTime, 'f', 8) + "  "
     + QString::number(cmMessage1.cMessage, 'x')); // <-- something like this perhaps
msgBox->exec();

错误:“重载 'number(char[11], char)' 的调用不明确”

修改:

sprintf(cM, "%x", &cmMessage1.cMessage);

QMessageBox *msgBox = new QMessageBox(0);
msgBox->setGeometry(QRect(QPoint(200,200),QSize(400,400)));
msgBox->setInformativeText(QString::number(cmMessage1.dTime, 'f', 8) + "  "
     + (QString)cM); // <-- something like this perhaps
msgBox->exec();

结果:bfb123d8 //错误


我想避免执行以下操作(循环或无循环):

 sprintf(cM, "%X%X%X%X%X%X%X%X%X%X%X", cmMessage1.cMessage[0],
                            cmMessage1.cMessage[1],
                            cmMessage1.cMessage[2],
                            cmMessage1.cMessage[3],
                            cmMessage1.cMessage[4],
                            cmMessage1.cMessage[5],
                            cmMessage1.cMessage[6],
                            cmMessage1.cMessage[7],
                            cmMessage1.cMessage[8],
                            cmMessage1.cMessage[9],
                            cmMessage1.cMessage[10]);

循环:

for(int i = 0; i < 11; i++){
    sprintf(cM + 2 * i, "%X", cmMessage1.cMessage[i]);

}
4

3 回答 3

1

这些number函数只是格式化一个数字。如果你想格式化数组中的每个数字,你需要一个循环,沿着

auto text = QString::number(cmMessage1.dTime, 'f', 8) + "  ";
for (unsigned c : cmMessage1.cMessage) {
    text += QString::number(c,16);
}
msgBox->setInformativeText(text);

(您还应该使用unsigned char, notchar来存储 8 位无符号值)。

于 2013-08-19T17:19:47.633 回答
0

您可以使用 std::hex 来做到这一点:

#include <iostream>
#include <algorithm>
#include <iomanip>
#include <iterator>
#include <string>

int main()
{
    std::string input = "";
    std::getline(std::cin, input);
    std::cout << "Standard Output:  " << input.c_str() << std::endl;
    std::cout << "Hex Output:  " << std::hex;
    std::copy(input.begin(), input.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
    return 0;
}
于 2013-08-19T18:08:34.590 回答
0

十六进制的美妙之处在于它以一种可以分解的方式进行翻译。

在这里查看答案: C++ 将字符串转换为十六进制,反之亦然

FredOverflow 使用:

A string like "Hello World" to hex format: 48656C6C6F20576F726C64.

看这个:“H_e_l_l_o_ _W_o_r_l_d”= 48_65_6C_6C_6F_20_57_6F_72_6C_64。

任何从事 Web 开发工作的人都会指出,20 是空间。

您可以将整个内容转换为十六进制,然后将空格插入十六进制字符串,或成对拆分,等等。

看一看:http ://www.asciitable.com/

为什么这行得通?它与二进制和十六进制的性质有关。因为以 16 为底的十六进制是以 2 为底的二进制的倍数,

72_dec = H_letter = 01001000_2 = 0100 1000 = 4 8 = 48_hex。你可以把它分开。所以“嗨!” = 486921(十六进制),每个单独为 48 69 21(H i !)

于 2013-08-19T17:21:01.737 回答