2016-07-12 16 views
0

私は以下の関数でバイトのシーケンスを印刷しようとしていますが、奇妙な何かが発生しています。文字は例えば0xEDです。 (中に疑問符がついた奇妙な文字で、あたかも印刷できないかのように)。それは私のコード、または私がそれを印刷するコンソールのためですか?バイトのシーケンスを印刷

また、コードは正しいですか、それを改善するために別のやり方をしていますか?

編集:出力例

1F 8B 08 00 00 00 00 00 97 86 22 0D 89 72 EC 04 ........ .."..r�. 

おかげ

void printBytes(std::string string) { 
    QDebug qD = qDebug().nospace(); 
    qD << "Printing string of size " << string.size() << "\n"; 
    char buffer [3]; 
    int j = 0; 
    std::string printable = ""; 
    for (uint32_t i = 0; i != string.size(); ++i) { 
     snprintf(buffer, sizeof(buffer), "%02X", (unsigned char) string.at(i)); 
     qD << buffer; 
     printable += QChar(string.at(i)).isPrint() ? string.at(i) : '.'; 
     printable += j == 7 ? " " : ""; 
     if (j == 15) { 
      qD << "\t" << printable.c_str() << "\n"; 
      printable = ""; 
      j = 0; 
     } else { 
      qD << (j == 7 ? " " : " "); 
      j++; 
     } 
    } 
    if (j != 0) { 
     qD << std::string((16-j) * 3, ' ').c_str() << "\t" << printable.c_str(); 
    } 
} 
+2

文字セットの不一致。文字セットYを使用するディスプレイ環境で文字セットXから文字を印刷しようとしていて、その "y"文字セットにその文字グリフがないか、その文字セットに無効な文字が含まれています。 –

+0

文字の代わりに数値を印字することを検討すべきでしょうか? – nosbor

+0

関連:http://stackoverflow.com/a/217269/12711 –

答えて

2

特定のオクテット(バイト)が特定の文字を表示するかどうかは、あなたのシステム環境のロケールに完全に依存します。

オクテット0xEDは実際にはISO-8859-1(またはISO-8859-15、おそらく)ロケールの文字です。しかし、たとえば、あなたのシステム環境のロケールがUTF-8(現代のすべてのオペレーティングシステムの場合と同じように)である場合、文字íはマルチバイトシーケンス0xC3 0xADによって表示されます。

最も可能性の高い答えは、ご指定のオペレーティングシステム(指定していない)がISO-8859-nロケールを使用していないが、おそらくUTF-8(またはその他のエンコーディング)である可能性があります。システム環境を再構成するか、プログラムの出力にUTF-8(または正しいエンコーディング)を使用してください。

+0

はい私のコンソールはUTF8を使用しています。自分のコードがUTF8として文字を表示するのがより意味があると思います。どうすればいい? – jido51

+0

まあ、表示したい文字に対応する 'UTF-8'オクテットシーケンスを' std :: cout'に書くことで可能です。 ISO-8859-1でエンコードされた文字を表示するのと同じプロセスです。 –

+0

申し訳ありませんが、私は従いません。私はちょうどwiresharkのように、行の右側の部分に印刷可能な文字を印刷したいですが、たとえisPrint()がtrueを返しても、印刷可能ではありません。だから私はそれを印刷可能にするために何をすべきか、あるいは何が間違っているのか? – jido51