同じトピックについて多くの提案を読んでいて、それらの多くを実装しようとしましたが、実際には私の環境内で実際に作業しているようです。 私はQT 5を使用していますが、この問題はQTとは関係なく、16進数の文字0x00がどのように解釈されるかと思います。 私は何を達成しなければならないことなど、進値としてunsigned char型のストリームを表示することです:C++で16進文字列を作成して表示する
入力バイト:$ 00の0x4E 0x01の0x00を0x17の0x00を
として表示:$ 00:の0x4E:0x01の:$ 00: 0x17の:$ 00
私が書いた
機能...それは非常に簡単そうですが、私が得るすべては空の文字列です:
QString getBufferAsHexStr(const unsigned char* buf, int buffsize) {
std::string finalstring("");
char tempbuff[5];
int n=0, index=0;
for (int c = 0; c < buffsize; c++) {
if(c == buffsize-1) {
n=sprintf(tempbuff, "0x%02X", buf[c]);
} else {
n=sprintf(tempbuff, "0x%02X:", buf[c]);
}
finalstring.append(tempbuff, n);
index += n;
}
QString resultStr(finalstring.c_str());
return resultStr;
}
QString getBufferAsHexStr(const unsigned char* buf, int buffsize) {
std::stringstream ss;
for (int c = 0; c < buffsize; c++) {
if(c == buffsize-1) {
ss << std::hex << std::showbase << buf[c];
} else {
ss << std::hex << std::showbase << buf[c] << ":";
}
}
const std::string finalstring = ss.str();
QString resultStr(finalstring.c_str());
return resultStr;
}
最初を使用して呼び出されますあなたの最初の例では 'tempbuff'をあなたが思っているものと同じ大きさにしていますか?あなたはこのサイズを「5」にして綱渡りをしています。なぜそれを10にして安全にしないのですか?実際には、バッファオーバーランです。なぜなら、あなたは6文字を入れることになるからです。 – PaulMcKenzie
@drescherjm:好奇心不足のため、なぜQStringで、 'std :: string'ではないのですか? –
これは2番目のオプションです。 – drescherjm