在消息中每个字符显示十六进制?

时间:2013-08-19 17:10:31

标签: c++ qt hex

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

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();

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

MODIFICATION:

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]);

}

3 个答案:

答案 0 :(得分: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而不是char来存储8位无符号值。)

答案 1 :(得分:0)

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

在这里看看答案: C++ convert string to hexadecimal and vice versa

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。

任何使用网络开发的人都可以指出,20就是空间。

您可以将整个事物转换为十六进制,然后只需在十六进制字符串中插入空格,或者将其拆分成对等等。

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

为什么这样做? 它与二进制和十六进制的性质有关。 因为hex,base 16是二进制的倍数,base 2,

72_dec = H_letter = 01001000_2 = 0100 1000 = 4 8 = 48_hex。 你可以拆分它。所以“嗨!”以十六进制表示= 486921,各自为48 69 21(H i!)

答案 2 :(得分: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;
}