http://www.perlmonks.org?node_id=11113265

Djinni has asked for the wisdom of the Perl Monks concerning the following question:

Hello,

I am trying to generate a a CRC-16/XMODEM checksum. I have been using: http://reveng.sourceforge.net/crc-catalogue/16.htm#crc.cat.crc-16-xmodem and crccalc.com as a guide. As well as Digest/CRC.pm however I have been unable to get the perl module Digest::CRC to give me the expected result.

#!/usr/bin/perl -w use strict; use Digest::CRC qw(crc64 crc32 crc16 crcccitt crc crc8 crcopenpgparmor +); my @s=( { 's'=>"9848C503738276ADCA02BF5DC1A3ABF2", 'crc16'=>"9F4B" }, { 's'=>"841374844ADDF4A36CEDB127C82086B9", 'crc16'=>"408E" }, { 's'=>"8AC1070ACD1659BB4F507191E33F7AD4", 'crc16'=>"E1E3" }, { 's'=>"34623A01DCDA35BED462953B4E2458DA", 'crc16'=>"7B40" }, { 's'=>"E29107CB32975E859D76A885BF57BE35", 'crc16'=>"2B92" }, { 's'=>"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 'crc16'=>"0041" }, ); # width=16 poly=0x1021 init=0x0000 refin=false refout=false xorout=0x0 +000 check=0x31c3 residue=0x0000 name="CRC-16/XMODEM" my $width = 16; my $init = 0x0000; my $xorout = 0x0000; my $refout = 0; my $poly = 0x1021; my $refin = 0; my $cont = 0x31c3; for my $tv (@s) { my $crc16 = crc($tv->{s},$width,$init,$xorout,$refout,$poly,$refin +,$cont); print qq{ Input was: $tv->{s} crc: $crc16 -- Should be: $tv->{crc16} }; }
I have another issue in that I do not understand what "cont" is here.

Replies are listed 'Best First'.
Re: Generating a CRC-16/XMODEM checksum in Hex
by Djinni (Novice) on Feb 20, 2020 at 18:08 UTC
    As is so often the case with these things. Mearly asking for help (not even getting any) is sometimes sufficient to help one see the solution!
    #!/usr/bin/perl -w use strict; use Digest::CRC; my @s=( { 's'=>"9848C503738276ADCA02BF5DC1A3ABF2", 'crc16'=>"9F4B" }, { 's'=>"841374844ADDF4A36CEDB127C82086B9", 'crc16'=>"408E" }, { 's'=>"8AC1070ACD1659BB4F507191E33F7AD4", 'crc16'=>"E1E3" }, { 's'=>"34623A01DCDA35BED462953B4E2458DA", 'crc16'=>"7B40" }, { 's'=>"E29107CB32975E859D76A885BF57BE35", 'crc16'=>"2B92" }, { 's'=>"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 'crc16'=>"0041" }, ); my $ctx = Digest::CRC->new(type=>"crc16"); $ctx = Digest::CRC->new(width=>16, init=>0x0000, xorout=>0x0000, refout=>0, poly=>0x1021, refin=>0, cont=>0); for my $tv (@s) { my $key = $tv->{s}; my $value = pack "H*", "$key"; $ctx->add($value); my $digest = $ctx->digest; my $hexdigest = sprintf("%X", $digest); print qq{ Input was: $key crc: $digest as HEX: $hexdigest -- Should be: $tv->{crc16} }; }
    $hexdigest now has the expected data value!
      "As is so often the case with these things. Mearly asking for help (not even getting any) is sometimes sufficient to help one see the solution!"

      That's called Rubber Duck Debugging :)