我从文件中读取了byte[]
,我希望从中获取两个字节的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
或272
十进制。但显然,byte[].getInt()
不存在。我怎样才能完成这项任务?
以上数组只是一个例子。我不知道实际值。
答案 0 :(得分:38)
你应该选择简单的方法:
int val = ((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff);
你甚至可以编写自己的辅助函数getBytesAsWord (byte[] bytes, int start)
来为你提供功能,如果你不想计算你的代码,但我认为这可能是过度的。
答案 1 :(得分:6)
尝试:
public static int getInt(byte[] arr, int off) {
return arr[off]<<8 &0xFF00 | arr[off+1]&0xFF;
} // end of getInt
你的问题没有说明两个参数(2,4)的含义。在你的例子中,2和4没有意义,因为数组中的索引找到ox01和0x10,我猜你想要连续两个元素,这是常见的事情,所以我在我的方法中使用off和off + 1。
你不能在java中扩展byte []类,所以你不能有一个方法bytes.getInt,所以我创建了一个静态方法,它使用byte []作为第一个arg。
该方法的“技巧”是你的字节是8位带符号的整数,超过0x80的值是负的并且将被符号扩展(即当用作int时为0xFFFFFF80)。这就是需要'&amp; 0xFF'掩蔽的原因。 '&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 8&gt '|'结合这两个值 - 就像'+'一样。运营商的顺序很重要,因为&lt;&lt;优先级最高,其次是&amp;然后是| - 因此不需要括号。
答案 2 :(得分:3)
这是一个很简单可靠的方法。
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 :(得分:1)
或者,您可以使用:
int val = (bytes[2] << 8) + bytes[3]
答案 4 :(得分:0)
您可以使用ByteBuffer。它有你正在搜索的getInt方法和许多其他有用的方法
答案 5 :(得分:0)
Google Base16课程来自Guava-14.0.1。
new BigInteger(com.google.common.io.BaseEncoding.base16().encode(bytesParam),16).longValue();