编辑代码

program CRC16Example;

type
  TByteArr = array of Byte;

function CalCRC16(AData: TByteArr; AStart, AEnd: Integer): Word;
const
  GENP = $A001;  //多项式公式 X16+X15+X2+1(1100 0000 0000 0101)
var
  crc: Word;
  i: Integer;
  tmp: Byte;
procedure CalOneByte(AByte: Byte);  //计算 1 个字节的校验码
var
  j: Integer;
begin
  crc := crc xor AByte;   //将数据与 CRC 寄存器的低 8 位进行异或
  for j := 0 to 7 do      //对每一位进行校验
  begin
    tmp := crc and 1;        //取出最低位
    crc := crc shr 1;        //寄存器向右移一位
    crc := crc and $7FFF;    //将最高位置 0
    if tmp = 1 then         //检测移出的位,如果为 1,那么与多项式异或
      crc := crc xor GENP;
    crc := crc and $FFFF;
  end;
end;
begin
  crc := $FFFF;             //将余数设定为 FFFF
  for i := AStart to AEnd do   //对每一个字节进行校验
    CalOneByte(AData[i]);
  end;
begin
  return crc;
end;

var
  data: TByteArr =  [FE,11,18,01,00,03,05,01,01];
begin
  Writeln(CalCRC16(data, 0, High(data)));
end.