从2或4个字节转换为有符号/无符号short / int

我必须将字节转换为有符号/无符号int或short。

下面的方法正确吗?哪个是签名的,哪个是未签名的?

字节顺序:LITTLE_ENDIAN

public static int convertTwoBytesToInt1(byte b1, byte b2) {

return (int) ((b2 << 8) | (b1 & 0xFF));

}

VS。

public static int convertTwoBytesToInt2(byte b1, byte b2) {

return (int) (( (b2 & 0xFF) << 8) | (b1 & 0xFF));

}

public static int  convertFourBytesToInt1(byte b1, byte b2, byte b3, byte b4){

return (int) ((b4<<24)+(b3<<16)+(b2<<8)+b1);

}

VS。

public static int  convertFourBytesToInt2(byte b1, byte b2, byte b3, byte b4){

return (int) (( (b4 & 0xFF) << 24) | ((b3 & 0xFF) << 16) | ((b2 & 0xFF) << 8) | (b1 & 0xFF));

}

我 对这种转换形式感兴趣。谢谢!

回答:

convertXXXToInt1()每对中的第一个方法()是带符号的,第二个(convertXXXToInt2())是无符号的。

但是,Java

int始终是带符号的,因此,如果设置的最高位,b4convertFourBytesToInt2()即使将其视为“无符号”版本,其结果也将为负。

假设byteb2是-1或十六进制的0xFF。所述<<操作者将导致其被“提升”到一个int为-1,或0xFFFFFFFF值类型。移位8位后,将为0xFFFFFF00,移位24个字节后,将为0xFF000000。

但是,如果应用按位运算&符,则高阶位将设置为零。这将丢弃标志信息。这是这两种情况的第一步,将详细介绍。

签:

byte b2 = -1; // 0xFF

int i2 = b2; // 0xFFFFFFFF

int n = i2 << 8; // 0x0xFFFFFF00

未签名:

byte b2 = -1; // 0xFF

int i2 = b2 & 0xFF; // 0x000000FF

int n = i2 << 8; // 0x0000FF00

以上是 从2或4个字节转换为有符号/无符号short / int 的全部内容, 来源链接: utcz.com/qa/421436.html

回到顶部