在十进制转十六进制的时候,我们用到了& 0xFF,这个是为了防止byte转成int的时候,从8位变成32位,会在高位自动补齐缺少的位数,补齐的数值和byte原来的高位值一样,因为java采用的补码的计算方式,当byte为负数的时候,高位补齐的值为1,这样会和原来的值有出入。
十进制 | 二进制 | 十六进制 |
2 | 0000 0010 | 02 |
-2 | 1111 1110 | fe |
例1:正确:Integer.toHexString(bytes[i] & 0xFF);
public static void main(String[] args) {
Byte[] bytes = {2, -2};
for (int i = 0; i < bytes.length; i++) {
String temp = Integer.toHexString(bytes[i] & 0xFF);
System.out.println(temp);
//结果:2 fe
}
}
例2:错误:Integer.toHexString(bytes[i]);
正数没有影响(因为用0来补齐),负数会在高位用1补齐,这样-2,会被解析成
11111111 11111111 11111111 11111110
public static void main(String[] args) {
Byte[] bytes = {2, -2};
for (int i = 0; i < bytes.length; i++) {
String temp = Integer.toHexString(bytes[i]);
System.out.println(temp);
//结果:2 fffffffe
}
}