zoukankan      html  css  js  c++  java
  • 使用摘要流获取文件的MD5

    摘要流是过滤流的一种,使用它可以再读取和写入流时获取流的摘要信息(MD5/SHA).

    使用摘要流包装流时,需要额外传递一个MessageDigest对象,

    MessageDigest md=MessageDigest.getInstance("MD5");
    DigestInputStream dis=new DigestInputStream(in, md);

    摘要流复写了流的read、write方法,方法内部调用MessageDigest对象的upate()来更新摘要信息

    public int read() throws IOException {
            int ch = in.read();
            if (on && ch != -1) {
                digest.update((byte)ch);
            }
            return ch;
        }

    调用MessageDigest对象的getDigest()可以获得摘要信息的byte[],通常情况我们需要获取字符串形式的MD5值,所以需要进行转换

    /**
         * 将字节数组转为十六进制字符串
         * 
         * @param bytes
         * @return 返回16进制字符串
         */
        public static String byteArrayToHex(byte[] bytes) {
            // 字符数组,用来存放十六进制字符
            char[] hexReferChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
                    '9', 'A', 'B', 'C', 'D', 'E', 'F' };
            // 一个字节占8位,一个十六进制字符占4位;十六进制字符数组的长度为字节数组长度的两倍
            char[] hexChars = new char[bytes.length * 2];
            int index = 0;
            for (byte b : bytes) {
                // 取字节的高4位
                hexChars[index++] = hexReferChars[b >>> 4 & 0xf];
                // 取字节的低4位
                hexChars[index++] = hexReferChars[b & 0xf];
            }
            return new String(hexChars);
        }

     -----------------------------------------------------

    2014.8.25

    今天看到网上有使用BigInteger来进行byte[]和十六进制的转换:

            byte[] d=md5.digest();
            BigInteger bigInt=new BigInteger(1,d);
            System.out.println(bigInt.toString(16));
  • 相关阅读:
    [剑指 Offer 11. 旋转数组的最小数字]
    进程描述符(PCB)
    [剑指 Offer 57. 和为s的两个数字]
    Linux netstat命令
    kafka2.3.X配置文件
    docker
    shell操作mysql数据库
    Linux文件查找之find命令
    sed 切割日志文件
    Linux文本处理之awk
  • 原文地址:https://www.cnblogs.com/DajiangDev/p/3915755.html
Copyright © 2011-2022 走看看