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

bla*_*olf 7 java int byte type-conversion

我必须将字节转换为signed/unsigned int或short.

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

字节顺序:LITTLE_ENDIAN

public static int convertTwoBytesToInt1(byte b1, byte b2) {
    return (int) ((b2 << 8) | (b1 & 0xFF));
}
Run Code Online (Sandbox Code Playgroud)

VS.

public static int convertTwoBytesToInt2(byte b1, byte b2) {
    return (int) (( (b2 & 0xFF) << 8) | (b1 & 0xFF));
}
Run Code Online (Sandbox Code Playgroud)

public static int  convertFourBytesToInt1(byte b1, byte b2, byte b3, byte b4){
    return (int) ((b4<<24)+(b3<<16)+(b2<<8)+b1);
}
Run Code Online (Sandbox Code Playgroud)

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));
}
Run Code Online (Sandbox Code Playgroud)

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

eri*_*son 8

convertXXXToInt1()每对的第一个方法()都是有符号的,第二个(convertXXXToInt2())是无符号的.

但是,Java int始终是有符号的,因此如果设置了最高位b4,则结果convertFourBytesToInt2()将为负,即使这应该是"无符号"版本.

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

但是,如果应用按位运算&符,则高位位将设置为零.这会丢弃标志信息.以下是这两个案例的第一步,更详细地说明了这一点.

签:

byte b2 = -1; // 0xFF
int i2 = b2; // 0xFFFFFFFF
int n = i2 << 8; // 0x0xFFFFFF00
Run Code Online (Sandbox Code Playgroud)

无符号:

byte b2 = -1; // 0xFF
int i2 = b2 & 0xFF; // 0x000000FF
int n = i2 << 8; // 0x0000FF00
Run Code Online (Sandbox Code Playgroud)