我正在处理一个缓冲区,它读取一个无符号的short,然后是一个3字节的整数并将它们组合起来。问题是我无法弄清楚如何正确添加一个整数,以便读取的数字(“结果”)与我添加到缓冲区的数字相同。
long val1 = (long) buffer.getUnsignedShort();
long val2 = (long) buffer.get3ByteInt();
long result = val2 + (val1 << 32);
public int getUnsignedShort() {
return (byteArray[position++] & 255 << 8) + byteArray[position++] & 255;
}
public int get3ByteInt() {
return (byteArray[position++] & 255 << 16) + (byteArray[position++] & 255 << 8) + byteArray[position++] & 255;
}
答案 0 :(得分:2)
除了3 * 8 = 24
不是32之外,您还遇到运算符优先级问题。移位运算符的优先级高于bitwise和。所以你的代码重写为:
return (byteArray[position++] & (255 << 8)) + (byteArray[position++] & 255);
不是你想要的。其他功能也有同样的问题。您可以使用括号来解决此问题:
long val1 = buffer.getUnsignedShort();
long val2 = buffer.get3ByteInt();
long result = val2 | (val1 << 24);
public int getUnsignedShort() {
return ((byteArray[position++] & 0xFF) << 8) | (byteArray[position++] & 0xFF);
}
public int get3ByteInt() {
return ((byteArray[position++] & 0xFF) << 16) | ((byteArray[position++] & 0xFF) << 8) | (byteArray[position++] & 0xFF);
}
我还将+
符号更改为|
,因为对我来说这是一个按位操作更清楚。出于同样的原因,我还将255
更改为0xFF
。这只是我的偏好。并且无需将int
投射到long
。