(一)
function UpdateCrc16(Value: Byte; Crc16: Word): Word;
begin
  Result := ((Crc16 shr 8) and $00FF) xor
    crc16tab[Byte(Crc16 xor (Word(Value)) and $00FF)];
end;function Crc16(const Value: string): Word;
var
  n: Integer;
begin
  Result := $FFFF;
  for n := 1 to Length(Value) do
    Result := UpdateCrc16(Ord(Value[n]), Result);
end;
========================================
(二)
s:  string;
p:  pointer;
buffer = ARRAY[1..65521] OF BYTE;
q:  ^buffer;p:= addr(s);
q:=p;FOR   i := 1 TO nBYTE DO
      CRCvalue := Hi(CRCvalue)  XOR  Table[ ord(q^[i]) XOR Lo(CRCvalue) ]为什么两段代码生成CRC不一样啊,我用的都是查表,表都是一样的,就是结果不一样,请问怎么回事

解决方案 »

  1.   

    这个是对的,算法有点问题Function CRC16(InString: PChar; iStrLen:integer) : Word;
    Var
      CRC     : Word;
      Index1,
      Index2  : Byte;
    begin
      CRC := $FFFF;
      For Index1 := 0 to iStrLen - 1 do
      begin
        Index2 := CRC xor byte((InString + Index1)^);
        CRC := (CRC SHR 8) xor (CRC16table[Index2]);
      end;
      CRC16 := (CRC and $FFFF)
    end;
      

  2.   

    找到答案了
    //需要赋初值,为$FFFF;CRCvalue := $FFFF;FOR   i := 1 TO nBYTE DO
          CRCvalue := Hi(CRCvalue)  XOR  Table[ ord(q^[i]) XOR Lo(CRCvalue) ]
      

  3.   

    请问这个算法哪里错了
    (二)
    s:  string;
    p:  pointer;
    buffer = ARRAY[1..65521] OF BYTE;
    q:  ^buffer;p:= addr(s);
    q:=p;FOR   i := 1 TO nBYTE DO
          CRCvalue := Hi(CRCvalue)  XOR  Table[ ord(q^[i]) XOR Lo(CRCvalue) ]
      

  4.   

    谢谢,My God,原来这么个细节被我忽略了,太感谢你了ffwin()
      

  5.   

    s:  string;
    p:  pointer;
    buffer = ARRAY[1..65521] OF BYTE;
    q:  ^buffer;p:= addr(s);
    q:=p;//需要赋初值,为$FFFF;CRCvalue := $FFFF;FOR   i := 1 TO nBYTE DO
          CRCvalue := Hi(CRCvalue)  XOR  Table[ ord(q^[i]) XOR Lo(CRCvalue) ]