8

UNIX の cksum コマンドと一致する方法で、バイト ストリームの 32 ビット CRC を計算する Java のライブラリ/コードはありますか?

4

3 に答える 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 に答える