54 lines
1.2 KiB
Text
54 lines
1.2 KiB
Text
[0:255]BITS crc_table;
|
|
BOOL crc_table_computed := FALSE;
|
|
|
|
PROC make_crc_table = VOID:
|
|
BEGIN
|
|
INT n, k;
|
|
FOR n FROM 0 TO 255 DO
|
|
BITS c := BIN n;
|
|
FOR k TO 8 DO
|
|
c := IF 32 ELEM c THEN
|
|
16redb88320 XOR (c SHR 1)
|
|
ELSE
|
|
c SHR 1
|
|
FI
|
|
OD;
|
|
crc_table[n] := c
|
|
OD;
|
|
crc_table_computed := TRUE
|
|
END;
|
|
|
|
PROC update_crc = (BITS crc, STRING buf) BITS:
|
|
BEGIN
|
|
BITS c := crc XOR 16rffffffff;
|
|
INT n;
|
|
|
|
IF NOT crc_table_computed THEN make_crc_table FI;
|
|
FOR n TO UPB buf DO
|
|
c := crc_table[ABS ((c XOR BIN ABS buf[n]) AND 16rff)] XOR (c SHR 8)
|
|
OD ;
|
|
c XOR 16rffffffff
|
|
END;
|
|
|
|
PROC hex = (BITS x) STRING :
|
|
BEGIN
|
|
PROC hexdig = (BITS x) CHAR: REPR (IF ABS x ≤ 9 THEN ABS x + ABS "0"
|
|
ELSE ABS x - 10 + ABS "a"
|
|
FI);
|
|
STRING h := "";
|
|
IF x = 16r0 THEN
|
|
h := "0"
|
|
ELSE
|
|
BITS n := x;
|
|
WHILE h := hexdig (n AND 16rf) + h; n ≠ 16r0 DO
|
|
n := n SHR 4
|
|
OD
|
|
FI;
|
|
h
|
|
END;
|
|
|
|
PROC crc = (STRING buf) BITS:
|
|
update_crc(16r0, buf);
|
|
|
|
STRING s = "The quick brown fox jumps over the lazy dog";
|
|
print(("CRC32 OF ", s, " is: ", hex (crc (s)), newline))
|