在Java中是否有任何库/代码可以以与Unix中的cksum命令一致的方式计算字节流的32位CRC?
cksum algorithm: POSIX 1003.2 CRC algorithm
length: 32 bits
type: crc
since: Jacksum 1.0.0
comment: - under BeOS it is /bin/cksum
- under FreeBSD it is /usr/bin/cksum
- under HP-UX it is /usr/bin/cksum and
/usr/bin/sum -p
- under IBM AIX it is /usr/bin/cksum
- under Linux it is /usr/bin/cksum
它是使用GPL许可的开源软件。
你尝试过使用CRC32类吗?
http://download.oracle.com/javase/7/docs/api/java/util/zip/CRC32.html
这是gzip使用的crc32。
cksum
命令允许选择历史算法,算法3与java.util.zip.CRC32
相同,正如@RobertTupelo-Schneck所指出的那样。但是由于某种原因,更紧凑的CheckedInputStream
会产生不同的校验和。$ cksum -o 3 /bin/ls
4187574503 38704 /bin/ls
package com.elsevier.hmsearch.util;
import static java.lang.System.out;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;
import java.util.zip.Checksum;
public class Demo {
static final String FILE = "/bin/ls";
public static void main(String[] args) throws Exception {
Checksum cs = new CRC32();
byte[] buffer = new byte[4096];
long totalBytes = 0;
InputStream is = Files.newInputStream(Paths.get(FILE));
int bytesRead = is.read(buffer);
totalBytes += bytesRead;
//CheckedInputStream checkedInputStream = new CheckedInputStream(is, new CRC32());
//while ((bytesRead = checkedInputStream.read(buffer, 0, buffer.length)) >= 0) {
// totalBytes += bytesRead;
//}
while (bytesRead > 0) {
cs.update(buffer, 0, bytesRead);
bytesRead = is.read(buffer);
if (bytesRead < 1)
break;
totalBytes += bytesRead;
}
//out.printf("%d %d %s\n", checkedInputStream.getChecksum().getValue(), totalBytes, FILE);
out.printf("%d %d %s\n", cs.getValue(), totalBytes, FILE);
}
}