2016-05-09 20 views
0

同じトピックについて多くの提案を読んでいて、それらの多くを実装しようとしましたが、実際には私の環境内で実際に作業しているようです。 私は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; 
} 
+0

最初を使用して呼び出されますあなたの最初の例では 'tempbuff'をあなたが思っているものと同じ大きさにしていますか?あなたはこのサイズを「5」にして綱渡りをしています。なぜそれを10にして安全にしないのですか?実際には、バッファオーバーランです。なぜなら、あなたは6文字を入れることになるからです。 – PaulMcKenzie

+0

@drescherjm:好奇心不足のため、なぜQStringで、 'std :: string'ではないのですか? –

+0

これは2番目のオプションです。 – drescherjm

答えて

4

もっと良い選択肢がある場合は、QStringのC++関数でC++関数を使い始めた理由がわかりません。次のようにQStringを使用すると、あなたはそれを実装するかもしれません:

QString getBufferAsHexStr(const unsigned char* buf, int buffsize) { 
    QString result; 
    for(int i = 0; i < buffsize; ++i) 
     result += "0x" + QString("%1:").arg(buf[i], 2, 16, QChar('0')).toUpper(); 
    result.chop(1); 
    return result; 
} 
+0

こんにちはixSci、あなたのソリューションはかなりうまく動作します、それは大文字の0が表示されませんが、私はそれを回避することができます。あなたの質問に答えるには:私はそれほどQTを知らない、私はまだそれを正しく使用することを学んでいる:) – Bruno

+0

@ブーノは、答えを更新しました。今度は0でケースを処理します。また、答えが役立つ場合は、答えの近くのチェックマークをクリックしてください。 – ixSci

+0

ありがとう、これは簡単なことですが、私を助けました。とても有難い – Bruno

0

QByteArrayと参加QStringListを使用して別のバージョン:

QString getBufferAsHexStr(QByteArray buf) { 
    QStringList byteStrings; 
    for (int i = 0; i < buf.size(); ++i) 
     byteStrings += QString("0x") + QString("%1").arg(buf[i], 2, 16, QChar('0')).toUpper(); 
    return byteStrings.join(":"); 
} 

をでなぜ、

QString result = getBufferAsHexStr(QByteArray(charArr, charArrSize));

関連する問題