######## Quelle: http://www.miscel.dk/MiscEl/CRCcalculations.html#CRC8 ##### use strict; use warnings; use 5.010; ## CRC8 bit sub Crc8 { my $Buffer = shift; my $Poly = shift; my $Init = shift; my @Buffer = split //,$Buffer; my $Result = $Init; for my $i (1..length($Buffer)) { $Result = $Result ^ ord($Buffer[$i-1]); for my $j (0..7) { $Result = ($Result & 0x80) ? ($Result << 1) ^ $Poly : $Result << 1; } } $Result = $Result & 0xFF; return $Result; } ### CRC8 byte, normal my @CrcTable = (); sub GenerateTableCrc8 { my $Poly = shift; for my $i (0..255) { $CrcTable[$i]= Crc8(chr($i),$Poly,0); } } sub Crc8Byte { my $Buffer = shift; my $Initial = shift; my $Result = $Initial; my @Buffer = split //,$Buffer; for my $i(1..length($Buffer)){ $Result = ($Result << 8) ^ $CrcTable[ (ord($Buffer[$i-1]) ^ ($Result)) & 0xFF ]; } $Result = $Result & 0xFF; return $Result; }