我有一个规范,读取接下来的两个字节是signed int.
要在java中读取我有以下内容
当我使用以下代码在java中读取signed int时,我得到值65449
计算无符号的逻辑
int a =(byte[1] & 0xff) <<8
int b =(byte[0] & 0xff) <<0
int c = a+b
Run Code Online (Sandbox Code Playgroud)
我相信这是错误的,因为如果我和0xff我得到一个无符号的等价物
所以我删除了&0xff和逻辑,如下所示
int a = byte[1] <<8
int b = byte[0] << 0
int c = a+b
which gives me the value -343
byte[1] =-1
byte[0]=-87
Run Code Online (Sandbox Code Playgroud)
我尝试用规范读取的方式来抵消这些值,但这看起来很错误.因为堆的大小不在此范围内.
在java中进行signed int计算的正确方法是什么?
这是规范的方式
somespec() { xtype 8 uint8 xStyle 16 int16 }
xStyle:一个有符号整数,表示从此Widget()结构的开头到xStyle()结构的开头的偏移量(以字节为单位),该结构表示由页面窗口小部件定义的继承样式以及专门应用于此窗口小部件的样式.
Pet*_*rey 14
如果你的值是有符号的16位你想要a short和int是32位,它也可以保持相同的值,但不是那么自然.
看起来你想要一个带符号的小端16位值.
byte[] bytes =
short s = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getShort();
Run Code Online (Sandbox Code Playgroud)
要么
short s = (short) ((bytes[0] & 0xff) | (bytes[1] << 8));
Run Code Online (Sandbox Code Playgroud)
顺便说一句:你可以使用int,但不是那么简单.
// to get a sign extension.
int i = ((bytes[0] & 0xff) | (bytes[1] << 8)) << 16 >> 16;
Run Code Online (Sandbox Code Playgroud)
要么
int i = (bytes[0] & 0xff) | (short) (bytes[1] << 8));
Run Code Online (Sandbox Code Playgroud)