下面这个方法想必大家都不陌生,无论操作文件 / 图片 / 字节流 等等,或多或少都使用过。
public static String bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i <b.length; i++) {
String hex = Integer.toHexString(b[ i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
那么通过 Integer 将 byte 转成十六进制字符串时,为何 byte 转 string 的时候需要将 byte 做与运算呢?
分析:
byte 是一个字节,8 bit 位;int 是 4 个字节,32 bit 位。
如果不跟 0xFF(1111 1111)做与运算, 结果会有误差,比如:
十进制 - 1,补码是 11111111 ,转换为 int 时变成 11111111111111111111111111111111(0xffffffff),多了 24 个 1!这种补位就会造成误差,反之,跟 0xFF 与原酸之后,高 24 bit 就会被清 0 了(00000000000000000000000011111111),现在结果就对了。