java基础

来源:互联网 发布:2017程序员笔记本 编辑:程序博客网 时间:2024/06/11 03:04

最近在用MD5的时候,在byte[] 转成String类型的时候

b.toString是调用了b这个object对象的类的toString方法。一般是返回这么一个String:[class name]@[hashCode]。

new String(b)是根据parameter是一个字节数组,使用java虚拟机默认的编码格式,将这个字节数组decode为对应的字符。若虚拟机默认的编码格式是ISO-8859-1,按照ascii编码表即可得到字节对应的字符。

例如:

package com.solex.workflow;

import java.security.MessageDigest;

public class MD5test {
    public String MD5(String s) {
        try {
            //将字符串转为byte数组
            byte[] b = s.getBytes();
            //获取MessageDigest对象,申明使用MD5算法进行加密(还有SHA算法)
            MessageDigest md = MessageDigest.getInstance("MD5");
            //输入报文
            md.update(b);
            //生成摘要
            byte[] bytes = md.digest();
            return byte2str(bytes);
        } catch (Exception exception) {
            exception.printStackTrace();
            return null;
        }
    }

    /* 把字节数组转为16进制字符串 */
    public String byte2str(byte[] b) {
        char[] hexNumsStr = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'A', 'B', 'C', 'D', 'E', 'F' };
        int len = b.length;
        char[] result = new char[len * 2];
        int k = 0;
        for (int i = 0; i < len; i++) {
            result[k++] = hexNumsStr[b[i] >>> 4 & 0xf];
            result[k++] = hexNumsStr[b[i] & 0xf];
        }
        return new String(result);
    }
    
    public static void main(String[] args){
        MD5test md5test=new MD5test();
        System.out.print(md5test.MD5("13579"));
        
    }
}

结果为:E13DD027BE0F2152CE387AC0EA83D863


但是:

package com.solex.workflow;

import java.security.MessageDigest;

public class MD5test {
    public String MD5(String s) {
        try {
            //将字符串转为byte数组
            byte[] b = s.getBytes();
            //获取MessageDigest对象,申明使用MD5算法进行加密(还有SHA算法)
            MessageDigest md = MessageDigest.getInstance("MD5");
            //输入报文
            md.update(b);
            //生成摘要
            byte[] bytes = md.digest();
            return byte2str(bytes);
        } catch (Exception exception) {
            exception.printStackTrace();
            return null;
        }
    }

    /* 把字节数组转为16进制字符串 */
    public String byte2str(byte[] b) {
        char[] hexNumsStr = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'A', 'B', 'C', 'D', 'E', 'F' };
        int len = b.length;
        char[] result = new char[len * 2];
        int k = 0;
        for (int i = 0; i < len; i++) {
            result[k++] = hexNumsStr[b[i] >>> 4 & 0xf];
            result[k++] = hexNumsStr[b[i] & 0xf];
        }
        return result.toString();
    }
    
    public static void main(String[] args){
        MD5test md5test=new MD5test();
        System.out.print(md5test.MD5("13579"));
        
    }
}

结果为:[C@38a97b0b

PS:new String()一般用于转码的时候使用

toString()一般用于打印的时候使用