位操作转换为整数

时间:2015-07-13 12:06:55

标签: java

我有一些二进制操作不能像我期望的那样工作。 我有字节数组,前两个字节有这些值:0x5和0xE0。 我想将它们组合成一个应该是0x5E0的整数值。 我试过了:

int val = (b[i]) << 8 | b[i+1];

但是该值出现0xFFFFFFEE0且第一个字节0x5正在丢失

我觉得这很容易?我做错了什么?

2 个答案:

答案 0 :(得分:13)

尝试:int val = ((b[i] & 0xff) << 8) | (b[i + 1] & 0xff)。不幸的是,字节用Java签名,因此如果设置了高位,则在转换为整数时会进行符号扩展。

答案 1 :(得分:5)

问题是byte数据类型已签名。因此,b[i+1]在执行操作之前会进行符号扩展,变为0xFFFFFFE0。当它与0x0500 b[i]<<8进行“或”后,0x0500会丢失。

您可以在执行操作之前通过与0xFF进行AND运算来解决此问题:

public static int toInt16(byte high, byte low) {
    int res = (high << 8);
    res |= (low & 0xFF);
    return res & 0xFFFF;
}

Demo.