最好是逐行翻译,说明下方法的作用private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6',
            '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };    protected static char[] encodeHex(byte[] data)
    {        int l = data.length;        char[] out = new char[l << 1];        // two characters form the hex value.
        for (int i = 0, j = 0; i < l; i++)
        {
            out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];
            out[j++] = DIGITS[0x0F & data[i]];
        }        return out;
    }    protected static byte[] decodeHex(char[] data) throws Exception
    {        int len = data.length;        if ((len & 0x01) != 0)
        {
            throw new Exception("Odd number of characters.");
        }        byte[] out = new byte[len >> 1];        // two characters form the hex value.
        for (int i = 0, j = 0; j < len; i++)
        {
            int f = toDigit(data[j], j) << 4;
            j++;
            f = f | toDigit(data[j], j);
            j++;
            out[i] = (byte) (f & 0xFF);
        }        return out;
    }

解决方案 »

  1.   

    char[] out = new char[l << 1]; //創建一個char數組,大小是l的一半。out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];//0xf0是8位掩碼,目的是得到高4位的掩碼,換算為DIGITS中的16進制中的值。
    out[j++] = DIGITS[0x0F & data[i]];//0x0F是得到第4位的掩碼。然后換算為DIGITS中的16進制中的值。
    if ((len & 0x01) != 0)//判斷len是否為0,就拋異常。
     byte[] out = new byte[len >> 1];//同理,創建一個byte數組,大小是len的兩倍。
    int f = toDigit(data[j], j) << 4;//toDigit方法沒找到...
      

  2.   

    不好意思,剛寫反了一句:char[] out = new char[l < < 1]; //創建一個char數組,大小是l的2倍。
    byte[] out = new byte[len >> 1];//同理,創建一個byte數組,大小是len的一半。 
      

  3.   

    private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6',
                '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; //定义一个字符数组,16个字符是对应的16进制的0~15,下标和值是对应的。    protected static char[] encodeHex(byte[] data)
        {        int l = data.length;    //取参数data的长度        char[] out = new char[l << 1];    //结果数组,l<<1,左移,相当于乘2,也就是说,out的长度是data的一倍。        // two characters form the hex value.
            for (int i = 0, j = 0; i < l; i++)
            {   
             //把0xf0&data[i]是把data[i]的低四位清零,>>>4是不带符号位的右移4位。
             //整个的操作就是把data[i]的高四位取出,做为下标,从DIGITS中找到对应的16进制字符,赋值给out[j]
            
                out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];  
                out[j++] = DIGITS[0x0F & data[i]];     //同上,取出低四位,并转为16进制。
            }        return out;
        }    protected static byte[] decodeHex(char[] data) throws Exception
        {        int len = data.length;        if ((len & 0x01) != 0)  //len&0x01!=0,说明len的最低位是1,同时说明len是一个奇数。
            {
                throw new Exception("Odd number of characters.");
            }        byte[] out = new byte[len >> 1]; //len>>1相当于len除2, 结果是参数数组的一半。        // two characters form the hex value.
            for (int i = 0, j = 0; j < len; i++)
            {    
                //toDigit方法没有找到,估计是把16进制的字符转为对应的16进制。
                //<<4是左移4位结果给f,低四位空出来,准备放下一数据。
                int f = toDigit(data[j], j) << 4; 
                j++;
                f = f | toDigit(data[j], j);         //低四位放入f。
                j++;
                out[i] = (byte) (f & 0xFF);        //f&0xff是把f的前三个字节清0,目的的去掉符号位的影响.把原来放进f的两个16进制对应的数看成无符号数。
            }        return out;
        }
      

  4.   


    一部分:protected static char[] encodeHex(byte[] data)
        {        int l = data.length;    //取参数data的长度        char[] out = new char[l << 1];    //结果数组,l<<1,左移,相当于乘2,也就是说,out的长度是data的一倍。        // two characters form the hex value.
            for (int i = 0, j = 0; i < l; i++)
            {   
                //把0xf0&data[i]是把data[i]的低四位清零,>>>4是不带符号位的右移4位。
                //整个的操作就是把data[i]的高四位取出,做为下标,从DIGITS中找到对应的16进制字符,赋值给out[j]
                
                out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];  
                out[j++] = DIGITS[0x0F & data[i]];     //同上,取出低四位,并转为16进制。
            }        return out;
        }
      

  5.   

    每个byte要转为两个16进制的字符,高四位对应一个,低四位对应一个.代码已经非常清楚了.再用文字去描述还有必要吗?
      

  6.   

    还有一点就是一个字符占两个字节...
    为什么char[] out = new char[l << 1];要扩大一倍类?
    还有就是为什么0xF0 & data[i]这个下标可以得到对应的16进制的字符?
      

  7.   


    基本没有用吧.java 的Integer类和Long类有toHexString()方法,可以把一个数值转为16进制的字符串.byte数可以变通一下使用.各个包装类都提供valueOf(String s, int radix) 把s按radix进制解析为整数.
      

  8.   

    刚开始写代码的时候,总想自己写东西来做某事情,其实好多都是现成的。多看API,不一定要特别仔细,过一遍,发现有可能将来要用到的,记录下来,便于以后查找。