[Back to CRC SWAG index] [Back to Main SWAG index] [Original]
{
SEAN PALMER
Here are some that make their tables on the fly (to save echo space)
I believe crc should be inited to 0 at start
This CRC-16 is not identical to the one used by the Xmodem and Zmodem
File transfer protocols. The polynomial is the same
(X^16+X^12+X^5+X^0 or 0x8408) but the bit-ordering is the opposite,
and preconditioning and postconditioning is used as in 32-bit CRCs.
This method is also used by the European version of X.25.
}
Var
crc16table : Array [Byte] of Word;
Procedure makeCRC16table;
Var
crc : Word;
i,n : Byte;
begin
For i := 0 to 255 do
begin
crc := i;
For n := 1 to 8 do
if odd(crc) then
crc := (crc shr 1) xor $8408
else
crc := crc shr 1;
crc16table[i] := crc;
end;
end;
Function updateCRC16(c : Byte; crc : Word) : Word;
begin
updateCRC16 := crc16table[lo(crc) xor c] xor hi(crc);
end;
{this is the same crc used For zModem crc32}
Var
crc32table : Array [Byte] of LongInt;
Procedure makeCRC32table;
Var
crc : LongInt;
i,n : Byte;
begin
For i := 0 to 255 do
begin
crc := i;
For n := 1 to 8 do
if odd(crc) then
crc := (crc shr 1) xor $EDB88320
else
crc := crc shr 1;
crc32table[i] := crc;
end;
end;
Function updateCRC32(c : Byte; crc : LongInt) : LongInt;
begin
updateCRC32 := crc32table[lo(crc) xor c] xor (crc shr 8);
end;
[Back to CRC SWAG index] [Back to Main SWAG index] [Original]