【问题标题】:Read two bytes into an integer?将两个字节读入一个整数?
【发布时间】:2016-01-15 04:31:51
【问题描述】:

我有一个从文件中读取的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() 不存在。我怎样才能完成这项任务?

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

【问题讨论】:

标签: java integer byte bytearray


【解决方案1】:

你应该选择简单的:

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

如果您不希望计算影响您的代码,您甚至可以编写自己的辅助函数 getBytesAsWord (byte[] bytes, int start) 来为您提供功能,但我认为这可能有点矫枉过正。

【讨论】:

  • 理想情况下应该是 (b1
  • 为什么是0xff?也就是说,和bytes[0] &lt;&lt; 8 | bytes[1]有什么区别?
【解决方案2】:

试试:

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

您的问题没有说明两个 args (2,4) 的含义。 2 和 4 在您的示例中作为数组中的索引来查找 ox01 和 0x10 没有意义,我猜您想要获取两个连续的元素,这是很常见的事情,所以我在方法中使用了 off 和 off+1。

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

该方法的“诀窍”是您的字节是 8 位 有符号 整数,超过 0x80 的值是负数,并且会进行符号扩展(即,当用作 int 时为 0xFFFFFF80)。这就是需要“&0xFF”掩码的原因。 '

【讨论】:

  • 感谢这个很好的解释。对于相同的东西但有符号的值,我使用:return arr[off]&lt;&lt;8 | arr[off+1]&amp;0xFF;
【解决方案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();

【讨论】:

    【解决方案4】:

    或者,您可以使用:

    int val = (bytes[2] << 8) + bytes[3]
    

    【讨论】:

    • 否:如果 bytes[2] 大于 0x7f,它将返回负整数。 paxdiablo 的答案中的“& 0xff”是必需的。
    【解决方案5】:

    您可以使用 ByteBuffer。它具有您正在搜索的 getInt 方法和许多其他有用的方法

    【讨论】:

      【解决方案6】:

      Google Base16 类来自 Guava-14.0.1。

      new BigInteger(com.google.common.io.BaseEncoding.base16().encode(bytesParam),16).longValue();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多