1

Qt でバイナリ ファイルを読み込もうとしています。

ファイルには、テキスト データとバイナリ (16 進数) データが混在しています。

ファイルには、16 進数で指定された長さのデータ領域が含まれています。

例えば:

00 01 BE 00 00 00 00 00 00 00 00 00 01

ここで、「BE」はファイルのオフセット BB にあります。BE は 190 なので、上の最後のバイトまでスクロールすると、次の 190 バイトが自分のデータであることがわかります。

上記のように、Qtコードでバイト値「BE」を190に変換しようとして、数日間苦労しました。

私が得た最高の値は "-66" で、もちろん 190-256 です。

別の例は次のとおりです。

00 01 D3 63 00 00 00 00 00 00 00 01

10 進数の 25555 である「63D3」に変換する必要があります。

ここに私のコードスニペットがあります:

  1. ファイルを読む:

    QFile file(iFile);
    if (!file.open(QIODevice::ReadOnly)) return;
    QByteArray iContents = file.readAll();
    
  2. 長さを取得する

    ushort  c3 = 0xFF;
    c3 = iContents.at(2); // c3 should be "BE" hex.
    printf ( "%0x %d\n", c3, c3 );
    

出力は次のとおりです。

FFFFFFBE -66

これを 190 として読み取るにはどうすればよいですか?

検索後にさまざまなことを試しましたが、コードに基本的なものが欠けていることを示唆するものは何もないようです。

変換を行う現在のコードは次のとおりです:decimal

4

1 に答える 1

1

QByteArray::at()は (署名付き) を返し、charそれを に割り当てますunsigned short。値 0xbe を符号なしとして扱いたいので、キャストする必要があります。 c3 = (unsigned char) iContents.at(2);

2 バイトのリトルエンディアン整数の場合 (単にD363興味があるだけで、ゼロはここでは意味がないと思いますか?):

unsigned short i = (unsigned char) iContent.at(2) | (unsigned char) iContent.at(3) << 8;

キャストは最も(unsigned char)優先度が高く、ビットごとの演算子のオペランドは整数に昇格されます (これが、シフト結果がゼロでない理由です)。

于 2014-05-12T01:04:51.013 に答える