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

我必须将字节转换为signed / unsigned 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)); } 

对这种转换forms感兴趣。 谢谢!

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

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

假设一个byte值, b2为-1,或hex为0xFF。 <<运算符将使其“提升”为值类型为-1或0xFFFFFFFF的int类型。 在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 

4字节无符号转换存在问题,因为它不适合int。 以下例程正常工作。

 public class IntegerConversion { public static int convertTwoBytesToInt1 (byte b1, byte b2) // signed { return (b2 << 8) | (b1 & 0xFF); } public static int convertFourBytesToInt1 (byte b1, byte b2, byte b3, byte b4) { return (b4 << 24) | (b3 & 0xFF) << 16 | (b2 & 0xFF) << 8 | (b1 & 0xFF); } public static int convertTwoBytesToInt2 (byte b1, byte b2) // unsigned { return (b2 & 0xFF) << 8 | (b1 & 0xFF); } public static long convertFourBytesToInt2 (byte b1, byte b2, byte b3, byte b4) { return (long) (b4 & 0xFF) << 24 | (b3 & 0xFF) << 16 | (b2 & 0xFF) << 8 | (b1 & 0xFF); } public static void main (String[] args) { byte b1 = (byte) 0xFF; byte b2 = (byte) 0xFF; byte b3 = (byte) 0xFF; byte b4 = (byte) 0xFF; System.out.printf ("%,14d%n", convertTwoBytesToInt1 (b1, b2)); System.out.printf ("%,14d%n", convertTwoBytesToInt2 (b1, b2)); System.out.printf ("%,14d%n", convertFourBytesToInt1 (b1, b2, b3, b4)); System.out.printf ("%,14d%n", convertFourBytesToInt2 (b1, b2, b3, b4)); } }