ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
35384 Топик полностью
aleksey (13.07.2005 13:54, просмотров: 1) ответил aleksey на Ответ: И что же мне глупому делать? Неужели никто не подскажет?
Ответ: Разобрался. Неверные типы переменных! Теперь и С и Паскаль дают одинаковый результат. 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;