0

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

我正在通过 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);

我错过了什么吗?二进制补码中的 -1 应该是11111111 11111111正确的吗?

编辑

我完全忘记了我是真正写的人EndianArrayUtils。该getShortFromLittleEndianRange方法的代码是

public static short getShortFromLittleEndianRange(byte[] range){
        return (short)((short)(range[1] >> 8) + (short)(range[0]));
    }

显然,它在负数上的运作方式有问题。

4

1 回答 1

5

我会使用 ByteBuffer

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

印刷

-1

如果您读入 ByteBuffer,则根本不需要byte[]

修复你的例子

public static short getShortFromLittleEndianRange(byte[] range){
    return (short)((range[1] << 8) + (range[0] & 0xff));
}
于 2012-08-30T15:08:27.033 回答