我正在使用一些小端二进制数据,我已经达到了一个尴尬的地方,我需要将奇数个字节转换为整数值。
现在使用ByteBuffer
类我能够读取整数并使用getInt()
getLong()
函数完美地完成,这些函数分别读取4和8个字节。
但是,在这个例子中,我需要读取三个字节并从中取出一个int。我已经尝试过getShort + get()
(2个字节+ 1个字节),但我认为这不是正确的做法。
我猜我需要将字节移位一起才能获得正确的int值,但我总是对位移感到困惑。
此外我还以为bytebuffer类会提供一个读取奇数个字节的函数,但似乎没有。
这样做的一种方法是创建一个长度为三个字节的byte [],将三个字节放入其中,然后在其周围包装一个bytebuffer,并从中读取一个int。但这似乎是很多额外的代码。
任何建议或意见都将不胜感激。
由于
答案 0 :(得分:6)
通过
获取三个字节byte[] tmp = new byte[3];
byteBuffer.get(tmp);
然后通过
转换为int
int i = tmp[0] << 16 | tmp[1] << 8 | tmp[2];
或
int i = tmp[2] << 16 | tmp[1] << 8 | tmp[0];
取决于您的结束。
答案 1 :(得分:3)
来自Java Language Specification:
原始...字节...值是8位...带符号的二进制补码整数。
To convert the byte to an "unsigned" byte, you AND it with 255。因此,函数将是:
private static int toInt( byte[] b )
{
return (b[0] & 255) << 16 | (b[1] & 255) << 8 | (b[2] & 255);
}
或
private static int toInt( byte[] b )
{
return (b[2] & 255) << 16 | (b[1] & 255) << 8 | (b[0] & 255);
}
取决于您的结束。