Voici le premier exemple dans la catégorie “CRC Libs”. Un algorithme de calcul de CRC IBM 16bits.
On retrouve cette algorithme dans des protocoles comme Bisync, Modbus, USB, ANSI X3.28, SIA DC-07
et beaucoup d’autres. Il est connu aussi sous le nom CRC-16 et CRC-16-ANSI.
len: la taille du tableau
data: le tableau avec les données
Free Pascal:
function CRC_16_IBM(len: longword; data: TBytes): integer; var num1, i: longword; num2: byte; j: integer; begin num1 := 0; num2 := 0; for i := 0 to len-1 do begin num2 := data[i]; if i=2 or i=3 then num2 := 0; num1 := num1 xor num2; for j := 0 to 7 do if (num1 and 1) > 0 then num1 := (num1 >> 1) xor $a001 else num1 := num1 >> 1; end; result := num1 and $ffff; end;
C#:
public static ushort CRC_16_IBM(uint len, byte[] data) { uint num1 = 0; byte num2 = 0; for (uint i = 0; i < len; i++) { num2 = data[i]; switch (i) { case 2: case 3: num2 = 0; break; } num1 ^= num2; for (uint j = 0; j < 8; j++) { if ((num1 & 1) > 0) { num1 = (num1 >> 1) ^ 0xa001; } else { num1 = num1 >> 1; } } } return (ushort)(num1 & 0xffff); }