1

この正確な動作に答える質問が見つかりませんでした。どういうわけか、何が起こっているのか理解できません:

Windows ビットマップ ファイル (bmp) の内容を配列に読み取り、後でこの配列を使用して必要な情報を抽出します。

char biHeader[40];
// ...
source.read(biHeader,40);
// ...
int biHeight = biHeader[8] | (biHeader[9] << 8) | (biHeader[10] << 16) | (biHeader[11] << 24);

この後、どちらが完全に間違っているかがbiHeight示されます。そこで、ファイルの 16 進ダンプを調べました。読み取った内容は次のとおりです。-112400

90 01 00 00

バイト順をビッグ エンディアンに変更すると、予想どおり、0x190どちらが40010 進数で表示されます。

上記のコードを次のように変更すると:

unsigned char biHeader[40];
// ...
source.read((char*)biHeader,40);
// ...
int biHeight = ... (same as before)

...次に、期待値を取得します。ここで何が起こっているのですか?

And: このデータをどのように読みますか?

4

1 に答える 1

5

符号付き 8 ビットの 2 の補数整数として、0x90-112です。に変換するint|、その値が保持されます。表現が 2 の補数である場合、7 番目以降のすべてのビットが設定されるため、ビットごとの値または少なくとも 8 ビット左にシフトされた値を使用しても値は変更されません。

符号なし 8 ビット整数として、 の値は 144 で、ビット セット0x90を超えるビットがない正の数です。2^7次に、ビットごとの or withbiHeader[9] << 8は、値を目的の に変更します144 + 256 = 400

ビット単位の演算子を使用する場合、(ほぼ) 常に符号なしの型を使用します。符号付きの型は、不快な驚きを引き起こすことがよくあります (また、シフト結果が範囲外であるか、負の整数が左にシフトされた場合の未定義の動作)。

于 2012-12-09T11:22:49.187 に答える