unsigned short crc16_ccitt(unsigned char data, unsigned short crc)
{
        unsigned short ccitt16 = 0x1021;        int i;        crc ^= (data<<8); /* 新的数据与将原来的余数(就是crc)相加(加法就是异或操作) */        /* 求数据的CRC校验码 */
        for (i=0; i<8; i++)
        {
                   if (crc & 0x8000) /* 最高位为1,减去除数 */
                   {
                            crc <<= 1;
                            crc ^= ccitt16;
                   }
                   else /* 最高位为0,不需要减去除数 */
                   {
                            crc <<= 1; /* 直接移位 */
                   }
        }        return crc;
}
/* 这是个主程序,表示如何计算5个字节的CRC */
void main()
{
        int i;
        unsigned short crc;
        char data[5] = { 0x71, 0x88, 0x93, 0xa5, 0x13 }; /* 计算这5个数据的CRC校验码 */        crc = 0;        for (i=0; i<5; i++)
        {
                   crc = crc16_ccitt(data[i], crc);
        }        printf("crc is %x", crc);
}

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    const
      data: array[0..4] of byte=($71,$88,$93,$a5,$13);
    var
      intI: Integer;
      rst: word;
      function Crc16(data:byte;var crc:word):word;
      var
        i: integer;
      begin
        crc := crc xor (data shl 8);
        for i:=0 to 7 do
          if (crc and $8000) <> 0 then
            crc := (crc shl 1) xor $1021
          else crc := crc shl 1;
        Result := crc;
      end;
    begin
      rst:=0;
      for intI:=0 to 4 do
        rst:= Crc16(data[intI],rst);
      showmessage(inttostr(rst));
    end;