контрольная сумма файла md5 из определенных байтов - PullRequest
1 голос
/ 04 февраля 2012

Я хочу создать контрольную сумму 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. Этот файл не является 1-байтовым файлом - это pidgin-2.10.1.exe

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

Хорошо, просто простой подход, без проверки ошибок, циклов и проверки размера, которые необходимы для надежного решения.Это читает 1 байт каждые 100 байт в байтовый буфер.

byte[] arr = new byte[100];
for (int i = 0; i < arr.length; i++) {
    is.read(arr, i, 1);
    is.skip(99);
}
1 голос
/ 04 февраля 2012

После некоторых разъяснений в комментариях похоже, что смещение, переданное в функцию 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;
}
...