Java bytebuffer 将三个字节转换为 int

Posted

技术标签:

【中文标题】Java bytebuffer 将三个字节转换为 int【英文标题】:Java bytebuffer convert three bytes to int 【发布时间】:2013-01-13 01:19:22 【问题描述】:

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

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

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

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

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

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

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

谢谢

【问题讨论】:

邮政编码你试过了,不是估计。请。 “我总是对位移感到困惑。”多远?左移 1 位就像乘以 2,右移 1 就像除以 2(并丢弃余数)。例如,您可以通过将字节左移 8 位来使字节成为字的最高有效字节 (MSB)。将最低有效字节添加到字中(或对其进行 ORing)从这两个字节构造一个完整的字。 感谢 TheBlastOne,帮助我理清思路! 【参考方案1】:

通过

获取三个字节
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];

取决于你的字节序。

【讨论】:

感谢 Arian,我觉得我需要这样做,但现在我可以看到它,我完全理解它在做什么。感谢您的快速回复!【参考方案2】:

来自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);

取决于你的字节序。

【讨论】:

以上是关于Java bytebuffer 将三个字节转换为 int的主要内容,如果未能解决你的问题,请参考以下文章

Java - 将 Int 转换为字节 - 奇怪的结果

使用 ByteBuffer 将 n 字节数组转换为整数

这个 Java ByteBuffer 的行为有解释吗?

如何在 Kotlin 中将数据类转换为 ByteBuffer?

如何从 ByteBuffer 转换为 Integer 和 String?

ByteBuffer 和字节数组