Algorithme CRC – 16 – IBM

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);
        }

Leave a Reply

Your email address will not be published. Required fields are marked *