short crc16_ccitt(const unsigned char *buf, int len)
{
      register int counter;
      register unsigned short crc = 0;
      for( counter = 0; counter < len; counter++)
           crc = (crc<<8) ^ crc16tab[((crc>>8) ^ *(char *)buf++)&0x00FF];
       return crc;
}function crc16(str: string): Word
var
  i: Integer;
  crc : word;
begin
  for i := 1 to length(str) do
  begin
  crc :=
      ((crc shl 8) and $ffff) xor arrCRC16[(((crc shr 8) and $ffff) xor StrToInt(str[i])) and $00FF];  
  end;
end;
但是 结果竟然错了~~~,不知道哪里错了求解arrCRC16 是个  Word 类型的16位数组求解。哪里错了

解决方案 »

  1.   

    for循环前crc没有附初值
    crc := 0;
      

  2.   

    StrToInt(str[i]) 这个也不对吧 似乎应该用 ord(str[i])
      

  3.   

    C中是用字符串的ascii码来异或的,而你改的Delphi将字符转成了整型,即字符'1',在C中当成49来处理的,而在Delphi中,转成了1来处理。
    将StrToInt(str[i])改成Ord(str[i])试试。
      

  4.   

    function crc16(str: pbyte;len : integer): Word
    var
      i: Integer;
      crc : word;
      pdata : pbyte;
    begin
      crc := 0; 
      pdata := buf;
      for i := 0 to len - 1  do
      begin
        crc := (crc shl 8) xor crc16tab[ ( (crc shl 8) xor pdata^ ) and $00FF ];
        pdata := pbyte(pchar(buf)+ 1);
      end;
    end;