use strict; use warnings; my ($poly, $crc8_initval, $crc8, $i, $j, $fbit, $bitcnt, $data); my @crc8_table; $poly = 0x2F; # => x^8 + x^5 + x^3 + x^2 + X + 1 $crc8_initval = 0xFF; @crc8_table = (); for ($i=0; $i<256; $i++) { $data = $i; $crc8 = $crc8_initval; for($bitcnt = 8; $bitcnt>0; $bitcnt--) { $fbit = ($crc8 ^ $data) & 0x01; if ($fbit == 1) { $crc8 = $crc8 ^ $poly; } $crc8 = ($crc8>>1) & 0x7F; if ($fbit == 1) { $crc8 = $crc8 | 0x80; } $data = $data>>1; } #printf("crc8[$i] = $crc8\n"); $crc8_table[$i] = $crc8; } #print table as c code: printf("\n\n"); printf("unsigned char crc8_lookuptable[256] = {"); for($i=0; $i<256; $i+=16) { printf("\n"); for($j=0; $j<16; $j++) { printf(" 0x%02X,",$crc8_table[$i+$j]); } } printf("\n};\n\n");