将两个字节读入整数?

时间:2011-01-22 16:13:11

标签: java integer byte bytearray

我从文件中读取了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等于0x0110272十进制。但显然,byte[].getInt()不存在。我怎样才能完成这项任务?

以上数组只是一个例子。我不知道实际值。

6 个答案:

答案 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();