Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

Generating a CRC-16/XMODEM checksum in Hex

by Djinni (Novice)
on Feb 20, 2020 at 17:37 UTC ( #11113265=perlquestion: print w/replies, xml ) Need Help??

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 :)

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://11113265]
Approved by haukex
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (7)
As of 2020-05-31 11:25 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    If programming languages were movie genres, Perl would be:















    Results (173 votes). Check out past polls.

    Notices?