我有一个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
谢谢你。
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;
}