13

ファイルからデータを読み取り、生データを 2 桁の 16 進文字列として表示しようとしています。

私は Qt フレームワーク、特に QTextEdit を使用しています。

私はさまざまなアプローチを試し、やりたいことをほぼ達成しましたが、何も知らない予期しないエラーがいくつかあります。

現在、これは私の実装です:

1) データを読み込みます。

ifstream file (filePath, ios::in|ios::binary|ios::ate);
if (file.is_open())
{
    size = file.tellg();
    memblock = new char [size+1];
    file.seekg(0, ios::beg);
    file.read(memblock, size);
    file.close();
}

2) 使用される単一の QString を作成します (QTextEdit には QString が必要なため)。

QString s;

3) 配列をループして、連続する各文字を QString に追加します。

int count = 0;
for(i=0;i<size;i++)
{
    count++;;
    s.append(QString::number(memblock[i], 16).toUpper());
    s.append("\t");
    if (count == 16)
    {
        s.append("\n");
        count -= 16;
    }
}

これで問題なく動作しますが、文字に到達した場合を除いて、次FFのように表示されますFFFFFFFFFFFFFFFF

だから私の主な質問は次のとおりです。

  1. 「FF」の文字だけが「FFFFFFFFFFFFFFFF」と表示されるのはなぜですか?
  2. QString::number を使用せずに char データを base 16 文字列に変換する方法はありますか?

この実装をできるだけ高速にしたいので、sprintf のようなものが機能する場合は、QString::number よりも高速であると推測されるので、お知らせください。

4

2 に答える 2

21

QStringバイナリデータには使用できません。QByteArray代わりに使用する必要があります。バッファから簡単に作成でき、char*を使用して 16 進文字列に簡単に変換できますtoHex

QByteArray array(memblock, size);
textEdit->setText(QString(array.toHex()));
于 2013-06-20T17:29:53.637 に答える
2

QString::numberを受け取るオーバーロードがないため、入力は;charに昇格されます。intしたがって、符号拡張の効果が見られます。より大きい入力に対して同様の動作が見られるはずです0x7F

関数を呼び出す前に、データをキャストしてみてください。

s.append(QString::number(static_cast<unsigned char>(memblock[i]), 16).toUpper());
于 2013-06-20T17:30:23.417 に答える