Java兼容的cksum函数

8

在Java中是否有任何库/代码可以以与Unix中的cksum命令一致的方式计算字节流的32位CRC?

3个回答

6
Jacksum: 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许可的开源软件。


@palacsint:我能在我的Java程序中使用哪些代码/算法,因为我不想使用任何第三方工具? - AabinGunz
1
有趣的事实是,jonelo.jacksum.algorithm.Cksum具有与Java的CRC32类相同的接口,但给出与Unix cksum相同的结果。 - Carlos Rendon
1
在使用该库于公司代码之前,我建议咨询公司法律顾问。这个许可证是GPL(“版权保护左派”),这意味着您必须向公众提供项目代码的源代码。如果它是LGPL(“较小通用公共许可证”),则您不需要提供对您专有代码的访问权限。 - Chris Wolf

2

3
我在多个网站上读到,Unix cksum 的 CRC-32 算法与 gzip 的不同。虽然我没有测试过,但很可能是真的。对我来说使用“Jacksum”(见上文)效果良好。 - Kowshik
3
@Kowshik,我可以证实Java的CRC32与/usr/bin/cksum不同。 - Carlos Rendon
1
@Kowshik,请检查我的答案。 - Sully

1
在MacOS上,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);
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接