ファイルから読み取った_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()
は存在しません。このタスクを実行するにはどうすればよいですか?
上記の配列は一例です。実際の値は不明です。
あなたは単純に選ぶべきです:
_int val = ((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff);
_
独自のヘルパー関数getBytesAsWord (byte[] bytes, int start)
を作成して、計算をコードに適用したくない場合は機能を提供することもできますが、多分やり過ぎでしょう。
試してください:
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つの値を結合します-'+'と同じように。 <<の優先順位が最も高く、その後に&が続き、|が続くため、演算子の順序は重要です。 -したがって、括弧は必要ありません。
これが、ニースのシンプルで信頼できる方法です。
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();
または、次のように使用することもできます。
int val = (bytes[2] << 8) + bytes[3]
Google Base16クラスはGuava-14.0.1からです。
new BigInteger(com.google.common.io.BaseEncoding.base16().encode(bytesParam),16).longValue();
ByteBufferを使用できます。あなたが探しているgetIntメソッドと他の多くの便利なメソッドがあります