当前位置: 首页 > 知识库问答 >
问题:

Java字节缓冲区将三个字节转换为int

谢墨竹
2023-03-14

我目前正在处理一些小的endian二进制数据,我已经到了一个尴尬的地步,需要将奇数字节转换成整数值。

现在使用ByteBuffer类,我能够很好地使用getInt()getLong()函数读取int和long,它们分别读取4和8个字节。

然而,在本例中,我需要读取三个字节,并将它们转换为int。我尝试过使用getShort get()(2字节1字节),但我认为这不是正确的方法。

我猜我需要对字节进行位移位才能得到正确的int值,但我总是对位移位感到困惑。

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

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

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

谢谢

共有2个答案

霍书
2023-03-14

根据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);
}

取决于你的耐心。

公孙宸
2023-03-14

通过获取三个字节

byte[] tmp = new byte[3];
byteBuffer.get(tmp);

然后通过

int i = tmp[0] << 16 | tmp[1] << 8 | tmp[2];

int i = tmp[2] << 16 | tmp[1] << 8 | tmp[0];

取决于你的耐心。

 类似资料:
  • 问题内容: 我需要将缓冲区的长度存储在4个字节大的字节数组中。 伪代码: 做到这一点的最佳方法是什么?请记住,稍后我必须将该字节数组转换回整数。 问题答案: 您可以使用以下方式将其转换为字节: 注意,这样做时可能必须考虑字节顺序。

  • 问题内容: 我正在尝试将一个转换成三个表示那个(大端)。 我敢肯定,这与位和移位有关。但是我不知道如何去做。 例如: *注意,我知道一个int是4个字节,三个字节有上溢/下溢的机会。 问题答案: 要获取最低有效字节: 第二个最低有效字节: 和第三个最低有效字节: 说明: 将值与0xFF(二进制为11111111)按位与将返回该数字中的最低有效8位(位0至7)。将数字右移8次会将第8至15位置于第0

  • 我遇到了将字节字符串转换为字节数组的强制转换问题。 我有一个字符串[B@1a758cb。也就是Base64加密的String的主String"Gunjan"。这里的解密我想把加密的字节串转换成字节[]。 但是String.get字节[]不适合我。String.getBytes[]给出字节String的字节数。 我该怎么做??我是否必须迭代字节字符串中的每个字符并将其转换为字节[]?? 编辑 我使用

  • 问题内容: 我想使用node.js进行HTTP请求以从Web服务器加载一些文本。由于响应可能包含很多文本(有些兆字节),因此我想分别处理每个文本块。我可以使用以下代码来实现: 这似乎没有问题。但是我想支持HTTP压缩,所以我使用zlib: 这可以是像多字节字符的问题,其由两个字节组成:和。如果第一个字节被第一个块()覆盖,第二个字节被第二个块覆盖,则将在文本块的结尾/开头产生不正确的字符。如何避免

  • 用这种方式将字节缓冲符转换为字符串是否正确, 我问这个问题的原因是,这看起来太简单了,而像Java这样的其他方法:将字符串转换成字节缓冲符和相关问题看起来更复杂。