0

制御できない特定のファイル形式のファイル保存および読み込み関数を作成しています。この形式では、テストファイルに32ビットの符号なしの値を示すために特定のバイト位置に4バイトのデータを書き込む必要があると指定されています。この値は16052、つまり0x00003EB4 ...なので、次の方法で保存されるバイト配列にデータを書き込みます。

data[index] = 0xB4;
data[index+1] = 0x3E;
data[index+2] = 0x00;
data[index+3] = 0x00;

データがリトルエンディアン形式であることがわかります。これは正しいです...問題は、ファイルロード関数を使用してこのデータをロードしようとすると、Javaがデータを次のように表示することです。

-76、62、0、0

バイトはJavaで署名されているため、0xB4値は-76として解釈されます...次のコードを使用してこれらの4バイトを単一の32ビット値に再構成しようとすると、値は-76...になります。

value = data[index+3];
value <<= 8;
value |= data[index+2];
value <<= 8;
value |= data[index+1];
value <<= 8;
value |= data[index];

これが行うべきことは次のとおりです:値を0x00(上位バイト)に設定する、左に8ビットシフトする、または0x00を下位8ビットにシフトする、左にシフトする8ビット、または0x3Eを下位8ビットにシフトする、左にシフトする8ビット、または0xB4(下位バイト)を下位8ビットに。

これにより、値0x00003EB4 ...が生成されます。これは、私が始めたものです...しかし、何らかの理由で、その操作の後に値-76が与えられていることがわかりません。

これは、Javaが0xB4バイトを値-76として解釈し、ビット単位のOR演算を台無しにしているためだと確信しています...

私の質問は、これを回避するために何をしなければならないかということです。

ありがとうございました。

4

1 に答える 1

3

バイトをロードするとき、それらは署名されています。それらが整数に強制変換されると、符号拡張されます。この問題を解決するには、ビット単位のANDを0xFFで実行して、符号付き整数の8LSbsのみを取得します。

あなたの場合value |= (data[index+i])value |= (data[index+i] & 0xFF)iあなたが持っているインデックスオフセットに置き換えられます)になるはずです。

于 2012-06-26T18:27:24.300 に答える