Java-совместимая функция cksum

Есть ли какая-либо библиотека/код на Java для вычисления 32-битного CRC потока байтов таким образом, чтобы это соответствовало команде cksum в unix?


person Kowshik    schedule 12.10.2011    source источник


Ответы (3)


Джексум: 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 

Это с открытым исходным кодом.

person palacsint    schedule 12.10.2011
comment
Отлично работает для меня. Спасибо за быстрый ответ! - person Kowshik; 13.10.2011
comment
@palacsint: есть ли код/алгоритм, который я могу использовать в своей Java-программе, так как мне не нужны никакие сторонние утилиты? - person AabinGunz; 04.09.2012
comment
Забавный факт: jonelo.jacksum.algorithm.Cksum имеет тот же интерфейс, что и класс Java CRC32, но дает тот же результат, что и unix cksum. - person Carlos Rendon; 25.06.2013

Вы пробовали класс CRC32?

http://download.oracle.com/javase/7/docs/api/java/util/zip/CRC32.html

Это crc 32, который использует gzip.

person Peter Lawrey    schedule 12.10.2011
comment
Я читал в Интернете в нескольких местах, что алгоритм crc-32 unix cksum отличается от алгоритма gzip. Я не проверял это, но, скорее всего, это правда. Использование «Jacksum» (см. выше) отлично работает для меня. - person Kowshik; 13.10.2011
comment
@Kowshik, я могу убедиться, что CRC32 Java НЕ совпадает с /usr/bin/cksum - person Carlos Rendon; 25.06.2013
comment
@Kowshik, проверь мой ответ, пожалуйста. - person Hitham S. AlQadheeb; 09.08.2017

Утверждение Карлоса Рендона: «Я могу убедиться, что CRC32 в Java НЕ совпадает с /usr/bin/cksum», неверно.

Как упомянул Питер Лоури, вы можете напрямую использовать CRC32 Java, чтобы получить ту же контрольную сумму, что и Unix/Linux cksum.

Правильный способ сделать это:

java.util.zip.CRC32 x = new java.util.zip.CRC32();
x.update(bytes);
StdOut.println("CRC32 (via Java's library)     = " + Long.toHexString(x.getValue()));

Источник: http://introcs.cs.princeton.edu/java/61data/CRC32.java.html

Используемый по умолчанию CRC основан на полиноме, используемом для проверки ошибок CRC в сетевом стандарте ISO/IEC 8802-3:1989.

person Hitham S. AlQadheeb    schedule 09.08.2017
comment
Это, безусловно, возвращает разные результаты для меня. Фактически, на моей машине (Mac) есть и /usr/bin/cksum, и /usr/bin/crc32. cksum <( echo -n hello ) дает 3287646509, а crc32 <( echo -n hello ) дает 3610a686, и я также проверил, что Java CRC32 возвращает то же значение, что и командная строка crc32, и НЕ то же самое значение, что и командная строка cksum. - person Robert Tupelo-Schneck; 30.08.2017
comment
Также на этом Mac cksum -o 3 <( echo -n hello ) дает 907060870, что совпадает с 3610a686. Таким образом, cksum -o 3 соответствует CRC32 в Java. Но это не алгоритм по умолчанию для /usr/bin/cksum на этой машине. - person Robert Tupelo-Schneck; 30.08.2017
comment
Алгоритм по умолчанию не 32-битный. Прочтите справочную страницу cksum для более подробной информации. - person Hitham S. AlQadheeb; 06.09.2017
comment
@HithamS.AlQadheeb неверен. Как личное тестирование, так и просмотр вики-страницы cksum показывают, что он несовместим с CRC-32. Страница руководства для cksum ничего не говорит об алгоритме и/или о том, сколько битов он требует. - person johnbr; 20.06.2018
comment
@ HithamS.AlQadheeb Я также приглашаю вас прочитать больше. man7.org/linux/man-pages/man1/cksum.1. HTML . и blog.box.com/ blog/crc32-checksums-the-good-the-bad-and-the-ugly . - person johnbr; 24.06.2018