0

C ++でファイルストリーミングを使用することにより、バイナリファイルの文字列をバッファ(4バイト)に読み込みました。バッファに「」が含まれていることを知っています89abcdef。バッファは次のようになります。

buffer[0] = 89
buffer[1] = ab
buffer[2] = cd
buffer[3] = ef

ここで、これらの数値を1つの16進数に復元したいと思います0x89abcdef。しかし、これは思ったほど簡単ではありません。次のコードを試しました。

int num = 0;
num |= buffer[0];
num <<= 24;
cout << num << endl;

この時点で、次のnumように表示されます

ea000000

バッファの2番目の要素に対して同じアルゴリズムを試したとき:

num = 0;
num |= buffer[1];
num <<= 16;
cout << num << endl;

出力:

ffcd0000

ff前は、cdそれらをすべて一緒に追加するのは非常に不便です(私はそれをのように見せて00cd0000、最初のものに追加することを計画していましたnum)。

誰かが16進数を回復するのを手伝ってもらえ0x89abcdefますか?ありがとう。

4

2 に答える 2

4

最後まで実際の数を変更しないでください。

num = buffer [0] << 24 | buffer [1] << 16 | buffer [2] << 8 | buffer [3];

buffer [0] << 24最初の結果とは独立した2番目の結果と組み合わされた最初の結果が得られます。

また、指摘したように、このような操作は、署名が結果に干渉しないように、符号なしの数値に対して実行する必要があります。

于 2012-06-14T18:52:41.110 に答える
2

すべてのビット演算では、intの代わりにunsignedintを使用する必要があります。このようにして、発生している種類の符号拡張の問題を回避できます。

于 2012-06-14T18:53:37.727 に答える