4

我目前正在处理一些小端二进制数据,我遇到了一个尴尬的点,我需要将奇数字节转换为整数值。

现在使用该类,我可以使用分别读取 4 字节和 8 字节ByteBuffer的函数完美地读取整数和长整数。getInt() getLong()

但是,在此示例中,我需要读取三个字节并从中生成一个 int。我试过做getShort + get()(2字节+ 1字节),但我认为这不是正确的做法。

我猜我需要将字节移位在一起以获得正确的 int 值,但我总是对移位感到有些困惑。

我还以为 bytebuffer 类会提供一个读取奇数字节的函数,但似乎没有。

一种方法是创建一个长度为三个字节的 byte[],将三个字节放入其中,然后在其周围包装一个字节缓冲区,并从中读取一个 int。但这似乎是很多额外的代码。

任何建议或意见将不胜感激。

谢谢

4

2 回答 2

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];

取决于你的字节序。

于 2013-01-29T13:01:11.523 回答
3

来自Java 语言规范

原始 ... 字节 ... 值是 8 位 ... 有符号二进制补码整数。

要将字节转换为“无符号”字节,请将其与 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);
}

取决于你的字节序。

于 2013-08-02T23:07:57.703 回答