2012-05-29 88 views
7

我不得不字节转换为符号/无符号int或短。下面从2个或4字节转换为符号/无符号短/ INT

的方法是正确的?哪些签名和哪些未签名?

字节顺序: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)); 
} 

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

+1

我会用字节缓冲区,因为这可以更加高效,你可以设置'.order(的ByteOrder.LITTLE_ENDIAN)' –

回答

6

每对的第一个方法(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 

无符号:

byte b2 = -1; // 0xFF 
int i2 = b2 & 0xFF; // 0x000000FF 
int n = i2 << 8; // 0x0000FF00 
+0

在convertFourBytesToInt1 B1没有与0xFF的......所以,如果我不把没什么区别?仍然是int? – blackwolf

+0

@blackwolf其实,它会有所作为,因为你是用'+'经营者合并字节。之前我没有注意到,因为其他人使用'|'运算符,这对于位操作是首选。表达应该是'(INT)((B4 << 24)|((B3&为0xFF)<< 16)|((B2&为0xFF)<< 8)|(B1&为0xFF))' – erickson

1

有一个与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)); 
    } 
} 
+0

什么是B1 &0xFF的? – ScottF

+0

@ScottF - 防止负值。 – dmolony

相关问题