web-dev-qa-db-ja.com

2バイトを整数に読み込みますか?

ファイルから読み取った_byte[]_があり、その2バイトからintを取得したい。次に例を示します。

_byte[] bytes = new byte[] {(byte)0x00, (byte)0x2F, (byte)0x01, (byte)0x10, (byte)0x6F};
int value = bytes.getInt(2,4); //This method doesn't exist
_

これにより、valueが_0x0110_、または10進数の_272_と等しくなります。しかし、明らかにbyte[].getInt()は存在しません。このタスクを実行するにはどうすればよいですか?

上記の配列は一例です。実際の値は不明です。

27
Alexis King

あなたは単純に選ぶべきです:

_int val = ((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff);
_

独自のヘルパー関数getBytesAsWord (byte[] bytes, int start)を作成して、計算をコードに適用したくない場合は機能を提供することもできますが、多分やり過ぎでしょう。

40
paxdiablo

試してください:

public static int getInt(byte[] arr, int off) {
  return arr[off]<<8 &0xFF00 | arr[off+1]&0xFF;
} // end of getInt

あなたの質問は、2つの引数(2,4)の意味を示していませんでした。 2と4は、配列内のインデックスとしてox01と0x10を見つけるので、例では意味がありません。2つの連続する要素を取得するのが一般的であるため、メソッドでoffとoff + 1を使用したと思います。

Javaでbyte []クラスを拡張できないため、メソッドbytes.getIntを使用できないため、byte []を最初の引数として使用する静的メソッドを作成しました。

メソッドの「トリック」は、バイトが8ビットであるということですsigned整数と0x80を超える値は負であり、符号拡張されます(つまり、intとして使用する場合は0xFFFFFF80)。そのため、「&0xFF」マスキングが必要です。 '<< 8'は、上位バイトを8ビット左にシフトします。 '|' 2つの値を結合します-'+'と同じように。 <<の優先順位が最も高く、その後に&が続き、|が続くため、演算子の順序は重要です。 -したがって、括弧は必要ありません。

6
Ribo

これが、ニースのシンプルで信頼できる方法です。

    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4);
    // by choosing big endian, high order bytes must be put
    // to the buffer before low order bytes
    byteBuffer.order(ByteOrder.BIG_ENDIAN);
    // since ints are 4 bytes (32 bit), you need to put all 4, so put 0
    // for the high order bytes
    byteBuffer.put((byte)0x00);
    byteBuffer.put((byte)0x00);
    byteBuffer.put((byte)0x01);
    byteBuffer.put((byte)0x10);
    byteBuffer.flip();
    int result = byteBuffer.getInt();
3
Matt

または、次のように使用することもできます。

int val = (bytes[2] << 8) + bytes[3]
1
David Weiser

Google Base16クラスはGuava-14.0.1からです。

new BigInteger(com.google.common.io.BaseEncoding.base16().encode(bytesParam),16).longValue();
0
Koekiebox

ByteBufferを使用できます。あなたが探しているgetIntメソッドと他の多くの便利なメソッドがあります

0
matteo rulli