0

メッセージに文字ごとに 16 進数を表示したい (可能であれば簡単な方法で、文字をループして実行できることを知っています):

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、 ではなくを使用して、 char8 ビットの符号なし値を格納する必要があります)。

于 2013-08-19T17:19:47.633 に答える
0

16 進数の優れた点は、分割できる方法で変換されることです。

ここで答えを見てください: C++は文字列を16進数に変換し、その逆も同様です

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 はスペースです。

全体を16進数に変換してから、スペースを16進数文字列に挿入するか、ペアで分割するなどできます。

覗いてみてください: http://www.asciitable.com/

なぜこれが機能するのですか?これは、2 進数と 16 進数の性質に関係しています。基数 16 の 16 進数は基数 2 の 2 進数の倍数なので、

72_dec = H_letter = 01001000_2 = 0100 1000 = 4 8 = 48_hex. 分割できます。だから「こんにちは!」= 16 進数で 486921、それぞれ個別に 48 69 21 (H i !)

于 2013-08-19T17:21:01.737 に答える
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 に答える