将两个字节读成一个整数?

2022-09-01 13:55:23

我有一个我从文件中读取的,我想从中获取两个字节。下面是一个示例: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

这应该等于 或十进制。但显然,不存在。如何完成此任务?value0x0110272byte[].getInt()

上面的数组只是一个示例。实际值对我来说是未知的。


答案 1

您应该选择简单的:

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

如果您不希望计算充斥您的代码,您甚至可以编写自己的帮助器函数来为您提供该功能,但我认为这可能有点过分了。getBytesAsWord (byte[] bytes, int start)


答案 2

尝试:

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[]作为第一个参数。

该方法的“诀窍”是,字节是8位有符号整数,0x80值是负数,并且会被符号扩展(即用作int时0xFFFFFF80)。这就是为什么需要“&0xFF”遮罩的原因。“<<8”移动的字节越重要,8位越大。“|”将这两个值组合在一起 - 就像“+”一样。运算符的顺序很重要,因为<<具有最高的优先级,其次是 & 然后是 |-- 因此不需要括号。