将两个字节读入整数?

Ale*_*ing 26 java byte integer 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
Run Code Online (Sandbox Code Playgroud)

这应该value等于0x0110272十进制.但显然,byte[].getInt()不存在.我怎样才能完成这项任务?

上面的数组只是一个例子.实际值对我来说不了解.

pax*_*blo 40

你应该选择简单的方法:

int val = ((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff);
Run Code Online (Sandbox Code Playgroud)

你甚至可以编写自己的帮助函数getBytesAsWord (byte[] bytes, int start)来为你提供功能,如果你不想让你的代码计算,但我认为这可能是过度的.

  • 理想情况下它应该是(b1 << 8)| (b2&0x00ff)如果第二个字节值大于128,则上述转换给出的值不正确,因为java将该字节视为负int. (4认同)

Rib*_*ibo 6

尝试:

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

你的问题没有说明两个args(2,4)的含义.在你的例子中,2和4没有意义,因为数组中的索引找到了ox01和0x10,我猜你想要连续两个元素,这是常见的事情,所以我在我的方法中使用off和off + 1.

你不能在java中扩展byte []类,所以你不能有一个方法bytes.getInt,所以我创建了一个静态方法,它使用byte []作为第一个arg.

该方法的"技巧"是你的字节是8位有符号整数,超过0x80的值是负数,并且将被符号扩展(即当用作int时为0xFFFFFF80).这就是需要'&0xFF'掩蔽的原因.'<< 8'将更重要的字节8位移位.'|' 结合这两个值 - 就像'+'一样.运算符的顺序很重要,因为<<具有最高优先级,后跟&后跟| - 因此不需要括号.


Mat*_*att 6

这是一个很好的简单可靠的方法。

    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();
Run Code Online (Sandbox Code Playgroud)