include "bin32.s7i";
const type: crc32TableType is array [0 .. 255] bin32;
const func crc32TableType: createCrc32Table is func
result
var crc32TableType: crc32Table is crc32TableType.value;
local
const bin32: IEEE_802_3_POLYNOMIAL is bin32(16#edb88320);
var bin32: crc is bin32(0);
var integer: i is 0;
begin
for i range 1 to 255 do
crc := bin32(i);
for 8 do
if crc & bin32(1) <> bin32(0) then
crc := (crc >> 1) >< IEEE_802_3_POLYNOMIAL;
else
crc >>:= 1;
end if;
end for;
crc32Table[i] := crc;
end for;
end func;
const crc32TableType: crc32Table is createCrc32Table;
const func bin32: crc32 (in string: stri) is func
result
var bin32: crc is bin32(16#ffffffff);
local
var char: ch is ' ';
begin
for ch range stri do
crc := crc32Table[ord(crc >< bin32(ch)) mod 256] >< crc >> 8;
end for;
crc ><:= bin32(16#ffffffff);
end func;
const func bin32: crc32 (in string: stri, in bin32: interimCrc) is func
result
var bin32: crc is bin32(0);
local
var char: ch is ' ';
begin
crc := interimCrc >< bin32(16#ffffffff);
for ch range stri do
crc := crc32Table[ord(crc >< bin32(ch)) mod 256] >< crc >> 8;
end for;
crc ><:= bin32(16#ffffffff);
end func;
const func crc32TableType: createBzip2Crc32Table is func
result
var crc32TableType: crc32Table is crc32TableType.value;
local
const bin32: BZIP2_POLYNOMIAL is bin32(16#04C11DB7);
var bin32: crc is bin32(0);
var integer: i is 0;
begin
for i range 1 to 255 do
crc := bin32(i << 24);
for 8 do
if crc & bin32(16#80000000) <> bin32(0) then
crc := (crc << 1) >< BZIP2_POLYNOMIAL;
else
crc <<:= 1;
end if;
end for;
crc32Table[i] := crc & bin32(16#ffffffff);
end for;
end func;
const crc32TableType: bzip2Crc32Table is createBzip2Crc32Table;
const func bin32: bzip2Crc32 (in string: stri) is func
result
var bin32: crc is bin32(16#ffffffff);
local
var char: ch is ' ';
begin
for ch range stri do
crc := bzip2Crc32Table[ord((crc >> 24) >< bin32(ch)) mod 256] ><
((crc << 8) & bin32(16#ffffffff));
end for;
crc ><:= bin32(16#ffffffff);
end func;
const func bin32: bzip2Crc32 (in string: stri, in bin32: interimCrc) is func
result
var bin32: crc is bin32(0);
local
var char: ch is ' ';
begin
crc := interimCrc >< bin32(16#ffffffff);
for ch range stri do
crc := bzip2Crc32Table[ord((crc >> 24) >< bin32(ch)) mod 256] ><
((crc << 8) & bin32(16#ffffffff));
end for;
crc ><:= bin32(16#ffffffff);
end func;