来自特定字节的md5文件校验和

时间:2012-02-04 13:08:36

标签: java byte md5 checksum

我想从文件中的特定字节创建md5校验和。 校验和将来自文件的100个字节。

我写这段代码:

public static String getMD5ChecksumByFlash(String filename) throws Exception {
    InputStream fis = new FileInputStream(filename);
    byte[] buffer = new byte[1];
    MessageDigest complete = MessageDigest.getInstance("MD5");

    int passes = fis.available() / 100;
    int currentOffset = 0;
    int readBytes = -1;

    do {
        System.out.println("0a "+currentOffset);
        System.out.println("0b "+readBytes);
        readBytes = fis.read(buffer, currentOffset, 1);
        System.out.println("1 "+currentOffset);
        System.out.println("2 "+readBytes);
        if ( readBytes!=-1 ) {
            complete.update(buffer, 0, readBytes);
            currentOffset += passes;
            System.out.println("4 "+readBytes);
        }
        System.out.println("3 "+currentOffset);
        System.out.println("5 "+readBytes);
    } while ( readBytes!=-1 );
    fis.close();

    byte[] b = complete.digest();
    String result = "";
    for (int i = 0; i < b.length; i++) {
        result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
    }
    return result;
}

但它不起作用:/ 它返回:

0a 0
0b -1
1 0
2 1
4 1
3 93928
5 1
0a 93928
0b 1
null

怎么了?

PS。 这个文件不是1byte文件 - 它是pidgin-2.10.1.exe

2 个答案:

答案 0 :(得分:1)

在评论中做了一些澄清之后,看起来传递给read函数的偏移量指定了数组中的偏移量,而不是文件。这就是你在那里获得null并抛出异常的原因。因此,您可以使用以下代码替换read调用来更正代码:

readBytes = fis.read(buffer, 0, 1);
fis.skip(passes - 1);

稍微不同,更完整的方法是:

public static String getMD5ChecksumByFlash(String filename) throws Exception {
    InputStream fis = new FileInputStream(filename);
    byte[] buffer = new byte[100];
    MessageDigest complete = MessageDigest.getInstance("MD5");

    int passes = fis.available() / 100;
    int currentOffset = 0;
    int readBytes = 0;

    for (int i = 0; i < 100; i++) {
        readBytes += fis.read(buffer, i, 1);
        // TODO: Check for I/O errors
        fis.skip(passes - 1);
    }
    fis.close();

    complete.update(buffer, 0, readBytes);

    byte[] b = complete.digest();
    String result = "";
    for (int i = 0; i < b.length; i++) {
        result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
    }
    return result;
}

答案 1 :(得分:1)

好的只是一个简单的方法,没有所有的错误检查,循环和大小检查,你需要一个可靠的解决方案。这会将每100字节1个字节读入bytebuffer。

byte[] arr = new byte[100];
for (int i = 0; i < arr.length; i++) {
    is.read(arr, i, 1);
    is.skip(99);
}