我正在尝试编写代码以生成与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
答案 0 :(得分:2)
答案 1 :(得分:0)
对不起,这是部分答案,但是我演示了从cksum -o 3
和Java获得匹配的结果。
我不确定cksum
的默认算法实现。但是,cksum
的“算法3”与ava.util.zip.CRC32
完全相同。换句话说,如果我这样做:cksum -o 3 somefile
-在Java中,我得到相同的结果:
static long getCRC32(String filePath) throws IOException {
CRC32 crc = new CRC32();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int len = 0;
try(SeekableByteChannel input = Files.newByteChannel(Paths.get(filePath), StandardOpenOption.READ)) {
while((len = input.read(buffer)) > 0) {
buffer.flip();
crc.update(buffer.array(), 0, len);
}
}
return crc.getValue();
}