UNIX の cksum コマンドと一致する方法で、バイト ストリームの 32 ビット CRC を計算する Java のライブラリ/コードはありますか?
質問する
4598 次
3 に答える
6
ジャックサム: http://www.jonelo.de/java/jacksum/index.html
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ライセンスのオープンソースです。
于 2011-10-12T21:54:21.557 に答える
2
CRC32 クラスを試しましたか?
http://download.oracle.com/javase/7/docs/api/java/util/zip/CRC32.html
これは gzip が使用する crc 32 です。
于 2011-10-12T21:00:10.410 に答える
1
@RobertTupelo-Schneck が指摘したように、MacOSのcksum
コマンドでは歴史的なアルゴリズムを選択でき、アルゴリズム 3 は と同じです。java.util.zip.CRC32
何らかの理由で、コンパクトに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);
}
}
于 2021-09-23T23:59:04.523 に答える