Chinaunix首页 | 论坛 | 博客
  • 博客访问: 242634
  • 博文数量: 27
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-10 13:39
文章分类

全部博文(27)

文章存档

2010年(17)

2009年(2)

2008年(8)

我的朋友
最近访客

分类: Java

2008-07-11 16:07:19

今天在实现一个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。
阅读(2323) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~