[DUG] CRC-CC!TT 16

Rohit Gupta rohit at cfl.co.nz
Fri Oct 31 08:18:36 NZDT 2008


Eric,

found it but not table based.  The only one I have that is table based 
is 32 bit (and that was only because it was too slow otherwise).  This 
should be fast enough at modern speed of cpus.  I see that I did this in 
1985.  Just a word of warning, the other way to do it is to use 0000 as 
the check word. 

{***************************************************************
**  Calculates CRC check words using the polynomial           **
**  X**16 + X**12 + X**5 + 1, when the check word is $FFFF.   **
***************************************************************}

PROCEDURE CRC_CCITT (VAR Dat; Len : smallint; Ins : BOOLEAN; VAR Crc : 
WORD);
VAR
   Buffer      : TBuf ABSOLUTE Dat;
   T, U, Count : WORD;
BEGIN
     FOR Count := 0 TO PRED(Len)
     DO BEGIN
        T   := Buffer [Count] XOR HI(Crc);
        U   := (T SHR 4) XOR T;
        Crc := (SWAP(LO(Crc)) + U) XOR
               (U SHL 5) XOR
               (U SHL 12);
     END;
     Crc := SWAP (Crc);
     IF Ins
     THEN BEGIN
          Buffer [Len]     := LO(Crc);
          Buffer [Len + 1] := HI(Crc);
     END;
END;

{***************************************************************
**  Calculates CRC check words using the polynomial           **
**  X**16 + X**12 + X**5 + 1, when the check word is $0000.   **
***************************************************************}

PROCEDURE CRC_Xmodem (VAR Dat; Len : smallint; Ins : BOOLEAN; VAR Crc : 
WORD);
VAR
   Buffer      : TBuf ABSOLUTE Dat;
   T, U, Count : WORD;
BEGIN
     Crc := SWAP(Crc);
     FOR Count := 0 TO PRED(Len)
     DO BEGIN
        T   := Buffer [Count] XOR HI(Crc);
        U   := (T SHR 4) XOR T;
        Crc := (SWAP(LO(Crc)) + U) XOR
               (U SHL 5) XOR
               (U SHL 12);
     END;
     Crc := SWAP(Crc);
     IF Ins
     THEN BEGIN
          Buffer [Len]     := LO(Crc);
          Buffer [Len + 1] := HI(Crc);
     END;
END;



Eric A wrote:
> I'm looking for code or an understandable algorithm for the 
> CRC-CCITT(16) routine.  There's a bunch of code on the net but most 
> don't do it with a table and most of it is in 'C' (not my cup of tea...)
>
> I'd prefer a table-based routine if possible for simplicity and 
> speed.  Could be either pascal or dotNet code.
>
> Any ideas?
>
> Eric
>
> ------------------------------------------------------------------------
>
>
> __________ Information from ESET NOD32 Antivirus, version of virus 
> signature database 3561 (20081027) __________
>
> The message was checked by ESET NOD32 Antivirus.
>
> http://www.eset.com
> ------------------------------------------------------------------------
>
> _______________________________________________
> NZ Borland Developers Group - Delphi mailing list
> Post: delphi at delphi.org.nz
> Admin: http://delphi.org.nz/mailman/listinfo/delphi
> Unsubscribe: send an email to delphi-request at delphi.org.nz with Subject: unsubscribe
>
>
> __________ Information from ESET NOD32 Antivirus, version of virus signature database 3561 (20081027) __________
>
> The message was checked by ESET NOD32 Antivirus.
>
> http://www.eset.com
>   

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://listserver.123.net.nz/pipermail/delphi/attachments/20081031/daaeaf57/attachment.html 


More information about the Delphi mailing list