Вычисление контрольной суммы CRC32 файла

Я пытаюсь вычислить контрольную сумму CRC32 файла для использования с этим модулем Mod_zip, я пытался сделать это с помощью PHP, но, к сожалению, потерпел неудачу, даже если он прошел, это не будет эффективно для больших файлов.

Я также пробовал команду linux cksum, но она вычисляет контрольную сумму CRC файла.

Я обнаружил, что perl в linux можно использовать для вычисления CRC32 файла, если это возможно, я мог бы использовать shell_exec для импорта вывода в мое приложение PHP, как я могу сделай это?


person Naveen Gamage    schedule 11.12.2013    source источник
comment
CRC32 не является единым уникальным алгоритмом. en.wikipedia.org/wiki/CRC32#Commonly_used_and_standardized_CRC На этой странице перечислены 12 различных вариантов, и это до рассмотрения прекондиционирования и посткондиционирования.   -  person Joe Z    schedule 11.12.2013
comment
@JoeZ - На этой странице указан только один CRC-32.   -  person Kenosis    schedule 11.12.2013
comment
@Kenosis: в списке есть 4 общих CRC-32 (с разными суффиксными буквами, да), и для каждого из четырех CRC-32 есть три варианта перечисленного полинома (прямой, обратный и обратный обратный). Когда вы скрещиваете их с обратным порядком байтов/обратным порядком байтов, предварительным условием 0 и 1, инвертированным/неинвертированным постусловием, получается беспорядок. Дайджест::CRC ( search.cpan.org/ ~olimaul/Digest-CRC-0.18/lib/Digest/CRC.pm ) обрабатывает все это, я полагаю, но его документация отсутствует.   -  person Joe Z    schedule 11.12.2013
comment
@Kenosis: обратите внимание, что если вашей целью является контрольная сумма, соответствующая ZIP (или какой-либо другой конкретной программе), это немного более ограничено. Я считаю, что метод crc32 в Digest::CRC сделает это, так как это наиболее распространенный CRC-32, который люди просят. (Я только что обжегся, так как я видел слишком много реализаций CRC во встраиваемом мире.)   -  person Joe Z    schedule 11.12.2013
comment
@JoeZ - есть 4 распространенных CRC-32 ... В ОП указан CRC32, а не один из его вариантов. Digest::CRC делает CRC- 32, как вы сказали. String::CRC32 также выполняет CRC-32.   -  person Kenosis    schedule 11.12.2013


Ответы (1)


Вы смотрели Digest::CRC? ? Из документации: «Он содержит функции-оболочки с правильными параметрами для CRC-CCITT, CRC-16, CRC-32 и CRC-64, а также CRC, используемый в ASCII-бронированной контрольной сумме OpenPGP».

use strict;
use warnings;
use Digest::CRC;

my $ctx = Digest::CRC->new( type => 'crc32' );

open my $fh, '<:raw', $ARGV[0] or die $!;
$ctx->addfile(*$fh);
close $fh;

print $ctx->hexdigest, "\n";

Использование командной строки: perl script.pl inFile

Надеюсь это поможет!

person Kenosis    schedule 11.12.2013
comment
Спасибо, но это вычисляет значение CRC файла, а не CRC32, CRC32 - 8 цифр, но возвращает 10 цифр. - person Naveen Gamage; 11.12.2013
comment
@NaveenGamage - Вы искали шестнадцатеричный дайджест? Это возвращает 8 шестнадцатеричных цифр. Это это CRC-32 для файлов. Изменили код, чтобы показать шестнадцатеричный дайджест. - person Kenosis; 11.12.2013
comment
@NaveenGamage - 0x означает только то, что следует шестнадцатеричное число; это не часть контрольной суммы. Обычный CRC-32 имеет 8 шестнадцатеричных цифр: 0x******** $ctx->hexdigest выше возвращает это. - person Kenosis; 11.12.2013
comment
да, теперь я понял, даже модуль mod_zip принимает значение CRC32 без 0x. Спасибо тебе за помощь. - person Naveen Gamage; 11.12.2013