今天在实现一个Hash类时,想要将Hash出来的byte[]结果转化成16进制显示出来,于是写了下面一段代码:
public class Util {
public static char[] hexDigits =
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
public static String toHexString(byte[] bytes) {
char[] chars = new char[bytes.length * 2];
for (int i = 0; i < bytes.length; i++) {
int b = bytes[i];
chars[i * 2] = Util.hexDigits[b >> 4];
chars[i * 2 + 1] = Util.hexDigits[b & 0xF];
}
return new String(chars);
}
}
结果运行出来程序竟然告诉我数组越界了,仔细检查了半天,注意上面标红的部分,在b >> 4之后的结果有可能出现负值,原来>>进行的是循环右移操作,如果原来的数字是(0101 1010)2的话,右移4位之后的结果就成了(1010 0101)2,自然就是负数了,既然这样,那就把低四位清零,这样右移之后的结果就不会受影响了。也就是将上面红色部分代码改为:
chars[i * 2] = Util.hexDigits[(b & 0xF0) >> 4];
修改之后结果正确!
顺便还发现了一个很奇怪的问题,Java中竟然没有无符号型的变量,什么int、float,只有一个带符号的类型,而没有类似unsigned int、unsigned float这种变量,难道Java中真的不需要这种东西么?各种感慨和疑惑中,sigh。
阅读(2345) | 评论(0) | 转发(0) |