Un autre CRC dans ma bibliothèque est le CRC-16-CCITT ou plus court le CRC-CCITT, je suis tombé sur son utilisation dans
un tourniquet automatique. On peux le retrouver dans X.25, V.41, HDLC FCS, XMODEM, Bluetooth, PACTOR, SD et autres.
Utilisation: crc := CRC_CRTITT(packet);
unit CRC_CCITT; interface const P_CCITT= $1021; function CRC_CRTITT(packet : tbytes):word; implementation var crc_table: array[0..255] of word; crc_table_init: boolean = false; procedure SendByte(B: Byte; var crc: word); var tmp, c: word; begin c := $00ff and B; tmp := (crc shr 8) xor c; crc := (crc shl 8) xor crc_table[tmp]; end; procedure MakeTable; var i, j: Integer; crc, c: word; begin for i := 0 to 255 do begin crc := 0; c := i shl 8; for j := 0 to 7 do begin if ((crc xor c) and $8000) > 0 then crc := ( crc shl 1 ) xor P_CCITT else crc := crc shl 1; c := c shl 1; end; crc_table[i] := crc; end; crc_table_init := TRUE; end; function CRC_CRTITT(packet : tbytes):word; var i: integer; crc: word; Begin crc := 0; if not crc_table_init then MakeTable; for i := 0 to length(packet)-1 do begin SendByte(packet[i], crc); end; CRC_CRTITT := CRC; end; end.