Исходник на СИ :
CODE
unsigned long Crc32(unsigned char *buf, unsigned long len)
{
unsigned long crc_table[256];
unsigned long crc;
for (int i = 0; i < 256; i++)
{
crc = i;
for (int j = 0; j < 8; j++)
crc = crc & 1 ? (crc >> 1) ^ 0xEDB88320UL : crc >> 1;
crc_table[i] = crc;
};
crc = 0xFFFFFFFFUL;
while (len--)
crc = crc_table[(crc ^ *buf++) & 0xFF] ^ (crc >> 8);
return crc ^ 0xFFFFFFFFUL;
};
Переписал на Паскале
CODE
var data:array[0..$ffff] of byte;
{
подготовка массива data[]
}
{ Считает crc в массиве data[] от start до endd }
procedure CRC32(start,endd:word):dword;
var
crc_table:array [0..255] of dword;
crc:dword;
i,j:word;
begin
for i:=0 to 255 do begin
crc:=i;
for j:=0 to 7 do if (crc and 1)=1 then crc:=((crc shr 1) xor $EDB88320)
else crc:=crc shr 1;
crc_table[i]:=crc;
end;
crc:=$FFFFFFFF;
for i:=start to endd do begin
crc:=(crc_table[(crc xor data[i]) and $ff]) xor (crc shr 8);
end;
CRC32:=crc xor $FFFFFFFF;
end;
Поправьте меня если ошибся.
Причина редактирования: Уменьшение видимого размера вложенных в сообщение исходников.