Java 从字节数组转换为short生成错误的负值

Java 从字节数组转换为short生成错误的负值,java,endianness,Java,Endianness,我已经有一段时间没有在位/字节级别进行操作了,如果这很简单,请原谅我 我正在通过Java应用程序中的TCP套接字从嵌入式设备接收数据。数据是小尾端(最低有效字节优先),我目前正试图从数据数组中获取short值。为此,我使用以下代码: byte[] valBytes = {data[0], data[1]}; short val = EndianArrayUtils.getShortFromLittleEndianRange(valBytes); 这适用于正数,但是当short应该是-1时,我得

我已经有一段时间没有在位/字节级别进行操作了,如果这很简单,请原谅我

我正在通过Java应用程序中的TCP套接字从嵌入式设备接收数据。数据是小尾端(最低有效字节优先),我目前正试图从数据数组中获取
short
值。为此,我使用以下代码:

byte[] valBytes = {data[0], data[1]};
short val = EndianArrayUtils.getShortFromLittleEndianRange(valBytes);
这适用于正数,但是当
short
应该是-1时,我得到的是-2。产生-2的数据是:

byte[] valBytes = {(byte)0xff, (byte)0xff};
short val = EndianArrayUtils.getShortFromLittleEndianRange(valBytes);
我错过什么了吗-二取一的补码应该是
11111111111111
正确吗

编辑

我完全忘了是我写的
EndianArrayUtils
getShortFromLittleEndianRange
方法的代码为

public static short getShortFromLittleEndianRange(byte[] range){
        return (short)((short)(range[1] >> 8) + (short)(range[0]));
    }
显然,它在负数上的运行方式有问题。

我会使用ByteBuffer

byte[] valBytes = {(byte)0xff, (byte)0xff};
short s = ByteBuffer.wrap(valBytes).order(ByteOrder.LITTLE_ENDIAN).getShort();
System.out.println(s);
印刷品

-1
如果读入字节缓冲区,则根本不需要
字节[]

修正你的例子

public static short getShortFromLittleEndianRange(byte[] range){
    return (short)((range[1] << 8) + (range[0] & 0xff));
}
public static short getShortFromLittleEndianRange(字节[]范围){
返回(短)((范围[1]我将使用ByteBuffer

byte[] valBytes = {(byte)0xff, (byte)0xff};
short s = ByteBuffer.wrap(valBytes).order(ByteOrder.LITTLE_ENDIAN).getShort();
System.out.println(s);
印刷品

-1
如果读入字节缓冲区,则根本不需要
字节[]

修正你的例子

public static short getShortFromLittleEndianRange(byte[] range){
    return (short)((range[1] << 8) + (range[0] & 0xff));
}
public static short getShortFromLittleEndianRange(字节[]范围){

返回(短)((范围[1]EndianArrayUtils从哪里来?你是对的,-1应该是ffff,我猜UTIL在转换为short时失败了。EndianArrayUtils是来自某个库的吗?如果不是,你能从中显示一些代码吗?@Fildor我是个白痴。我很久以前写过
EndianArrayUtils
,后来就忘了。我一直以为它是java类哈哈。让我把代码发出来。:)这没什么好说的。这是界面好的标志,不是吗?@Fildor也许…如果它能工作;-)EndianArrayUtils从哪里来?你是对的,-1应该是ffff,我猜UTIL在转换为short时失败了。EndianArrayUtils是来自某个库的吗?如果不是,你能从中显示一些代码吗?@Fildor我是个白痴。我很久以前写过
EndianArrayUtils
,后来就忘了。我一直以为它是java类h啊哈。让我把代码发出去。:)这没什么好说的。这是界面好的标志,不是吗?@Fildor也许…如果它能工作;-)同意,在@Fildor帮我发现我自己写了
EndianArrayUtils
之后,我就换了这个。它似乎比字节移位等慢。这准确吗?有没有办法像我那样做呢?使用wrap()会慢一些。如果你用ByteBuffer而不是
byte[]
只有这样它才会更快。同意,在@Fildor帮助我发现我自己编写了
EndianArrayUtils
之后,我才切换到这个版本。它看起来确实比字节移位慢,等等。这准确吗?有没有办法像我这样做?使用wrap()速度较慢。如果使用ByteBuffer而不是使用
字节[]
,则速度更快。