自从我在位/字节级别完成操作已经有一段时间了,所以如果这很简单,请原谅我.
我通过嵌入式设备在Java应用程序中通过TCP套接字接收数据.数据是小端(最不重要的字节优先),我正在尝试short从数据数组中获取值.为此,我使用以下代码:
byte[] valBytes = {data[0], data[1]};
short val = EndianArrayUtils.getShortFromLittleEndianRange(valBytes);
Run Code Online (Sandbox Code Playgroud)
这适用于正数,但当short应该为-1时,我得到-2而不是.产生-2的数据是:
byte[] valBytes = {(byte)0xff, (byte)0xff};
short val = EndianArrayUtils.getShortFromLittleEndianRange(valBytes);
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?两个补码中的-1应该是11111111 11111111正确的吗?
编辑
我完全忘记了我是那个真正写过的人EndianArrayUtils.该getShortFromLittleEndianRange方法的代码是
public static short getShortFromLittleEndianRange(byte[] range){
return (short)((short)(range[1] >> 8) + (short)(range[0]));
}
Run Code Online (Sandbox Code Playgroud)
显然,这对负数运算有什么不对.
我会使用ByteBuffer
byte[] valBytes = {(byte)0xff, (byte)0xff};
short s = ByteBuffer.wrap(valBytes).order(ByteOrder.LITTLE_ENDIAN).getShort();
System.out.println(s);
Run Code Online (Sandbox Code Playgroud)
版画
-1
Run Code Online (Sandbox Code Playgroud)
如果您读入ByteBuffer,则根本不需要它byte[].
修复你的例子
public static short getShortFromLittleEndianRange(byte[] range){
return (short)((range[1] << 8) + (range[0] & 0xff));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8612 次 |
| 最近记录: |