Ответ: Разобрался. Неверные типы переменных! Теперь и С и Паскаль дают одинаковый результат. calccr32 взята из http://zxmak.narod.ru/udidoc.zip
Но сдвиг вправо для signed и unsigned не одинаково работает в С
Цитата из http://citforum/pr …/cpp_ref/ref_4.shtml#7
Е1>>Е2
Гарантируется, что сдвиг вправо является логическим (заполнение нулями), если Е1 является unsigned; в противном случае он может быть арифметическим (заполнение копией знакового бита).
Пришлось править так:
unsigned long CalcCRC32(unsigned long CRC, unsigned char Symbol)
{
unsigned long temp;
CRC ^= 0xFFFFFFFF ^ Symbol;
for(int k = 8; k--;)
{
temp = -(CRC & 1), CRC >>= 1, CRC ^= 0xEDB88320ul & temp;
}
CRC ^= 0xFFFFFFFF;
return CRC;
}
function calccr32(crc:longword ;symbol:integer):longword;
var k:integer;
temp:longword;
begin
crc:= crc xor (-1 xor symbol);
for k:=0 to 7 do
begin
temp:= -(CRC and 1);
crc:=crc shr 1;
crc:=crc xor 3988292384 and temp;
end;
crc:=crc xor $FFFFFFFF;
calccr32:=crc;
end;