有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

我正在通过Java应用程序中的TCPsocket从嵌入式设备接收数据。数据是little endian(最低有效字节优先),我目前正试图从数据数组中获取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);

我错过什么了吗-二分之一的补语应该是11111111 11111111正确吗

编辑

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

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

很明显,这在负数上是有问题的


共 (1) 个答案

  1. # 1 楼答案

    我会用ByteBuffer

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

    印刷品

    -1
    

    如果你读入字节缓冲区,你根本不需要byte[]

    修正你的例子

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