Javaでバイナリファイルを読み込もうとしています。符号なし8ビット値、符号なし16ビット値、および符号なし32ビット値を読み取るメソッドが必要です。これを行うのに最適な(最も速く、見栄えの良いコード)ものは何ですか?私はこれをC++で実行し、次のようなことを実行しました。
uint8_t *buffer;
uint32_t value = buffer[0] | buffer[1] << 8 | buffer[2] << 16 | buffer[3] << 24;
しかし、Javaでは、たとえばbuffer [1]に、左シフトの結果として符号ビットが設定された値が含まれている場合、これは問題を引き起こします。特定の場所で0xA5のみにOR:ingする代わりに、0xFFFFA500などでOR:sを実行すると、上位2バイトが「損傷」します。
私は今このようなコードを持っています:
public long getUInt32() throws EOFException, IOException {
byte[] bytes = getBytes(4);
long value = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);
return value & 0x00000000FFFFFFFFL;
}
4バイトを変換したい場合0x670xA50x72 0x50結果は、0x5072A567ではなく0xFFFFA567になります。
編集:これはうまくいきます:
public long getUInt32() throws EOFException, IOException {
byte[] bytes = getBytes(4);
long value = bytes[0] & 0xFF;
value |= (bytes[1] << 8) & 0xFFFF;
value |= (bytes[2] << 16) & 0xFFFFFF;
value |= (bytes[3] << 24) & 0xFFFFFFFF;
return value;
}
しかし、これを行うためのより良い方法はありませんか?10ビット演算は、このような単純なものでは「ビット」のように見えます。(私がそこで何をしたかを参照してください)=)