我是资源的搬运工~~~
关于这个字节数组转化为十六进制字符串时 &0xff,看到很多次了,这里整理一下网上的资料,记录一下:
/**
* 字节数组转换成字符串HEX表示
*
* @param data 字节数组
* @return 字节数组的HEX字符串表示
*/
public static String bytes2HexString(byte[] data) {
if (data == null) {
throw new NullPointerException();
}
StringBuilder buffer = new StringBuilder();
for (byte b : data) {
String hex = Integer.toHexString(b & 0xff);//为啥呢1 ??
if (hex.length() == 1) {
buffer.append('0');//为啥呢2 ??
}
buffer.append(hex);
}
return buffer.toString().toUpperCase();
}
为啥呢1 :保持二进制补码的一致性,因为计算机保存机制是:正数存储的二进制原码,负数存储的是二进制的补码
为啥呢2:如果是十六进制的0f,默认只显示f,此时要补上0
注:当系统检测到byte可能会转化成int或者说byte与int类型进行运算的时候,就会将byte的内存空间高位补1(也就是按符号位补位)扩充到32位,再参与运算。