我有一些二进制操作不能像我期望的那样工作。 我有字节数组,前两个字节有这些值:0x5和0xE0。 我想将它们组合成一个应该是0x5E0的整数值。 我试过了:
int val = (b[i]) << 8 | b[i+1];
但是该值出现0xFFFFFFEE0且第一个字节0x5正在丢失
我觉得这很容易?我做错了什么?
答案 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;
}