java - 将字节转换为整数 - 为什么每个字节都带有 0xff?

java - convert bytes to integer - why AND each byte with 0xff?

有什么区别:

int n = (b1 & 0xff) << 24 | (b2 & 0xff) << 16 | (b3 & 0xff) << 8 | b4 & 0xff

int n = b1 << 24 | b2 << 16 | b3 << 8 | b4

?为什么要AND每个字节加上255

让我假设 b1b2b3b4 的类型是 byte

在这种情况下,它们的值将被符号扩展,如果它们是负数,如果不使用 AND,结果将是错误的。

演示:

class Test {
    public static void main(String[] args) {
        byte a = (byte)128;
        int x1 = a << 8;
        int x2 = (a & 0xff) << 8;
        System.out.println(x1);
        System.out.println(x2);
    }
}

Output:

-32768
32768

首先您需要了解 b1 <<< 24 期望 a 操作数是 intlong 类型。因此,如果 b1byte,Java 将在转换发生之前将其转换为 int

通过将每个 byte 值映射到相应的 int 值来进行转换。问题是 bytesigned 类型,这意味着可能的值是 -128+127。因此,当你转换一个负值的byte时,你会得到一个负值的int;例如字节 11111111 (二进制)是 -1 变成 11111111111111111111111111111111 (二进制)也是 -1.

那些领先的是符号扩展的结果,如果我们要移动它们并以按位方式组合它们,我们不需要它们。

因此,您经常会看到一个字节被 0xff 屏蔽,以删除转换后符号扩展的(不需要的)结果。例如

    11111111111111111111111111101110  &
    00000000000000000000000011111111

给予

    00000000000000000000000011101110