读取和写入5个字节长

时间:2018-04-03 18:52:58

标签: java

我正在处理一个缓冲区,它读取一个无符号的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;
}

1 个答案:

答案 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