我有一个规范,它读取接下来的两个字节是有符号的 int。
要在 java 中阅读,我有以下内容
当我使用以下代码在 java 中读取一个有符号的 int 时,我得到一个值 65449
unsigned的计算逻辑
int a =(byte[1] & 0xff) <<8
int b =(byte[0] & 0xff) <<0
int c = a+b
我认为这是错误的,因为如果我和 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
我试图用规范读取的方式来抵消这些值,但这看起来是错误的。因为堆的大小不在此范围内。
在 java 中计算 signed int 的正确方法是什么?
规范是这样的
somespec() { xtype 8 uint8 xStyle 16 int16 }
xStyle :一个带符号的整数,表示从此 Widget() 结构的开头到 xStyle() 结构的开头的偏移量(以字节为单位),该结构表示由页面小部件定义的继承样式以及专门应用于此小部件的样式.
最佳答案
如果您的值是一个带符号的 16 位,您需要一个 short
,而 int 是 32 位,它也可以保存相同的值,但不是那么自然。
看来您需要一个带符号的小端 16 位值。
byte[] bytes =
short s = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getShort();
或
short s = (short) ((bytes[0] & 0xff) | (bytes[1] << 8));
顺便说一句:您可以使用 int 但它不是那么简单。
// to get a sign extension.
int i = ((bytes[0] & 0xff) | (bytes[1] << 8)) << 16 >> 16;
或
int i = (bytes[0] & 0xff) | (short) (bytes[1] << 8));
关于java - 如何从java中的字节读取有符号整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7157901/