Вычислить значение файла CheckSum из Java - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь написать код для генерации того же значения контрольной суммы, которое было сгенерировано командой UNIX cksum.

Когда я запускаю свой код и команду для одного и того же файла, я получаю разные значения.

Что не так с моим кодом?

package cksum;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.zip.Adler32;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;

public class Cksum1 {
    public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
        //MessageDigest md = MessageDigest.getInstance("MD5");
        String File = "C:\\Users\\admin\\Desktop\\logback XMLs\\STG_logback_Debug_All.xml";
        //String File = args[0];
        doChecksum32(File);
    }

    private static void doChecksum32(String fileName) {
        try {
            CheckedInputStream cis = null;
            long fileSize = 0;
            try {
                // Computer CRC32 checksum
                cis = new CheckedInputStream(
                        new FileInputStream(fileName), new CRC32());
                fileSize = new File(fileName).length();
            } catch (FileNotFoundException e) {
                System.err.println("File not found.");
                System.exit(1);
            }
            byte[] buf = new byte[128];
            while (cis.read(buf) >= 0) {
            }
            long checksum = cis.getChecksum().getValue();
            System.out.println(checksum + " " + fileSize + " " + fileName);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

}

Вывод Java:

пробег: 1478491164 8335 C: \ Users \ admin \ Desktop \ logback XMLs \ STG_logback_Debug_All.xml СТРОИТЬ УСПЕШНО (общее время: 0 секунд)

Выход Unix:

[tibroot @ myserver ~] $ cksum ./STG_logback_Debug_All.xml 1715323814 8335 ./STG_logback_Debug_All.xml

1 Ответ

2 голосов
/ 30 марта 2019

полином для cksum равен 0x04C11DB7

, в то время как jdk использует x^32 + x^26 ...

см. Также https://en.wikipedia.org/wiki/Cyclic_redundancy_check

...