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
?
让我假设 b1
、b2
、b3
和 b4
的类型是 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);
}
}
-32768
32768
首先您需要了解 b1 <<< 24
期望 a
操作数是 int
或 long
类型。因此,如果 b1
是 byte
,Java 将在转换发生之前将其转换为 int
。
通过将每个 byte
值映射到相应的 int
值来进行转换。问题是 byte
是 signed 类型,这意味着可能的值是 -128
到 +127
。因此,当你转换一个负值的byte
时,你会得到一个负值的int
;例如字节 11111111
(二进制)是 -1
变成 11111111111111111111111111111111
(二进制)也是 -1
.
那些领先的是符号扩展的结果,如果我们要移动它们并以按位方式组合它们,我们不需要它们。
因此,您经常会看到一个字节被 0xff
屏蔽,以删除转换后符号扩展的(不需要的)结果。例如
11111111111111111111111111101110 &
00000000000000000000000011111111
给予
00000000000000000000000011101110
有什么区别:
int n = (b1 & 0xff) << 24 | (b2 & 0xff) << 16 | (b3 & 0xff) << 8 | b4 & 0xff
和
int n = b1 << 24 | b2 << 16 | b3 << 8 | b4
?为什么要AND
每个字节加上255
?
让我假设 b1
、b2
、b3
和 b4
的类型是 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);
}
}
-32768
32768
首先您需要了解 b1 <<< 24
期望 a
操作数是 int
或 long
类型。因此,如果 b1
是 byte
,Java 将在转换发生之前将其转换为 int
。
通过将每个 byte
值映射到相应的 int
值来进行转换。问题是 byte
是 signed 类型,这意味着可能的值是 -128
到 +127
。因此,当你转换一个负值的byte
时,你会得到一个负值的int
;例如字节 11111111
(二进制)是 -1
变成 11111111111111111111111111111111
(二进制)也是 -1
.
那些领先的是符号扩展的结果,如果我们要移动它们并以按位方式组合它们,我们不需要它们。
因此,您经常会看到一个字节被 0xff
屏蔽,以删除转换后符号扩展的(不需要的)结果。例如
11111111111111111111111111101110 &
00000000000000000000000011111111
给予
00000000000000000000000011101110