HeapByteBuffer 如何将字节数组转换为短数组

问题描述 投票:0回答:1

我有一个java程序,我正在尝试将字节数组转换为短数组。

byte arr[] = {-1,-1};
int value = ByteBuffer.wrap(arr).order(ByteOrder.LITTLE_ENDIAN).getShort();

我从上面得到的值是

-1
。但它的实际价值应该是
65535

我决定看看该库如何将字节数组值转换为实际的短值。在深入了解函数时,我想我看到了这个类中的函数

java.nio.Bits
,它正在执行将字节数组转换为短数组的实际工作,它的实现是这样的

private static short makeShort(byte var0, byte var1) {
        return (short)(var0 << 8 | var1 & 255);
}

该函数正在处理第二个字节的负值,但不处理第一个字节。

我不确定,但上面函数的 return 语句不应该是这样的吗

private static short makeShort(byte var0, byte var1) {
        return (short)((var0 & 0xFF) << 8 | var1 & 255);
}

java版本:8

谢谢你。

java arrays byte bytebuffer
1个回答
0
投票

short
已签名。其最大值为 32767,最小值为 -32768。

无论您如何更改其实现,

ByteBuffer.getShort
都无法返回
short
值 65535,因为 65535 不是
short
的有效值。

getShort
的实施是正确的。两个字节的位都是
1111 1111
(= -1),得到的
short
1111 1111 1111 1111
(也= -1)。

但是你do

getShort
返回的内容分配给
int
变量
value
,因此
value
可以存储65535。但是,从
short
int
sign-extends的隐式转换,而不是零扩展,位,所以你仍然得到-1的值。

您可以使用

Short.toUnsignedInt
将有符号的
short
视为无符号,并得到
int

int value = Short.toUnsignedInt(byteBuffer.getShort());
// value is 65535

并且

toUnsignedInt
的实现可能正是您所期望的:

public static int toUnsignedInt(short x) {
    return ((int) x) & 0xffff;
}
© www.soinside.com 2019 - 2024. All rights reserved.