diff options
Diffstat (limited to 'lib/Crypt/Checksum/CRC32.pm')
-rw-r--r-- | lib/Crypt/Checksum/CRC32.pm | 129 |
1 files changed, 100 insertions, 29 deletions
diff --git a/lib/Crypt/Checksum/CRC32.pm b/lib/Crypt/Checksum/CRC32.pm index fc7f56a3..690ba6a7 100644 --- a/lib/Crypt/Checksum/CRC32.pm +++ b/lib/Crypt/Checksum/CRC32.pm @@ -2,36 +2,20 @@ package Crypt::Checksum::CRC32; use strict; use warnings; -our $VERSION = '0.056'; +our $VERSION = '0.059'; + +use base qw(Crypt::Checksum Exporter); +our %EXPORT_TAGS = ( all => [qw( crc32_data crc32_data_hex crc32_data_int crc32_file crc32_file_hex crc32_file_int )] ); +our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); +our @EXPORT = qw(); use Carp; $Carp::Internal{(__PACKAGE__)}++; use CryptX; -sub addfile { - my ($self, $file) = @_; - - my $handle; - if (ref(\$file) eq 'SCALAR') { #filename - open($handle, "<", $file) || croak "FATAL: cannot open '$file': $!"; - binmode($handle); - } - else { #handle - $handle = $file - } - croak "FATAL: invalid handle" unless defined $handle; - - my $n; - my $buf = ""; - while (($n = read($handle, $buf, 32*1024))) { - $self->add($buf) - } - croak "FATAL: read failed: $!" unless defined $n; - - return $self; -} - -sub CLONE_SKIP { 1 } # prevent cloning +sub crc32_file { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::CRC32->new->addfile(@_)->digest } +sub crc32_file_hex { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::CRC32->new->addfile(@_)->hexdigest } +sub crc32_file_int { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::CRC32->new->addfile(@_)->intdigest } 1; @@ -43,20 +27,101 @@ Crypt::Checksum::CRC32 - Compute CRC32 checksum =head1 SYNOPSIS + ### Functional interface: + use Crypt::Checksum::CRC32 ':all'; + + # calculate CRC32 checksum from string/buffer + $checksum_raw = crc32_data($data); + $checksum_hex = crc32_data_hex($data); + $checksum_int = crc32_data_int($data); + # calculate CRC32 checksum from file + $checksum_raw = crc32_file('filename.dat'); + $checksum_hex = crc32_file_hex('filename.dat'); + $checksum_int = crc32_file_int('filename.dat'); + # calculate CRC32 checksum from filehandle + $checksum_raw = crc32_file(*FILEHANDLE); + $checksum_hex = crc32_file_hex(*FILEHANDLE); + $checksum_int = crc32_file_int(*FILEHANDLE); + + ### OO interface: use Crypt::Checksum::CRC32; $d = Crypt::Checksum::CRC32->new; $d->add('any data'); + $d->add('another data'); $d->addfile('filename.dat'); $d->addfile(*FILEHANDLE); - $checksum_raw = $d->digest; # raw bytes + $checksum_raw = $d->digest; # raw 4 bytes $checksum_hex = $d->hexdigest; # hexadecimal form + $checksum_int = $d->intdigest; # 32bit unsigned integer =head1 DESCRIPTION -Calculating CRC32 checksums (OO interface); +Calculating CRC32 checksums. + +I<Updated: v0.057> + +=head1 EXPORT + +Nothing is exported by default. + +You can export selected functions: + + use Crypt::Checksum::CRC32 qw(crc32_data crc32_data_hex crc32_data_int crc32_file crc32_file_hex crc32_file_int); -I<Since: CryptX-0.032> +Or all of them at once: + + use Crypt::Checksum::CRC32 ':all'; + +=head1 FUNCTIONS + +=head2 crc32_data + +Returns checksum as raw octects. + + $checksum_raw = crc32_data('data string'); + #or + $checksum_raw = crc32_data('any data', 'more data', 'even more data'); + +=head2 crc32_data_hex + +Returns checksum as a hexadecimal string. + + $checksum_hex = crc32_data_hex('data string'); + #or + $checksum_hex = crc32_data_hex('any data', 'more data', 'even more data'); + +=head2 crc32_data_int + +Returns checksum as unsigned 32bit integer. + + $checksum_int = crc32_data_int('data string'); + #or + $checksum_int = crc32_data_int('any data', 'more data', 'even more data'); + +=head2 crc32_file + +Returns checksum as raw octects. + + $checksum_raw = crc32_file('filename.dat'); + #or + $checksum_raw = crc32_file(*FILEHANDLE); + +=head2 crc32_file_hex + +Returns checksum as a hexadecimal string. + + $checksum_hex = crc32_file_hex('filename.dat'); + #or + $checksum_hex = crc32_file_hex(*FILEHANDLE); + +=head2 crc32_file_int + +Returns checksum as unsigned 32bit integer. + + $checksum_int = crc32_file_int('filename.dat'); + #or + $checksum_int = crc32_file_int(*FILEHANDLE); =head1 METHODS @@ -110,11 +175,17 @@ Returns the checksum encoded as a hexadecimal string. $result_hex = $d->hexdigest(); +=head2 intdigest + +Returns the checksum encoded as unsigned 32bit integer. + + $result_int = $d->intdigest(); + =head1 SEE ALSO =over -=item * L<CryptX|CryptX>, L<Crypt::Checksum> +=item * L<CryptX|CryptX> =item * L<https://en.wikipedia.org/wiki/Cyclic_redundancy_check> |