Среда WinAVR. Вычисляю CRC32 как описано тут http://ru.wikipedia.org/wiki/Crc#CRC-32
Код
// ===================================================
unsigned long CRC32Table[256] = {0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, итд}
int main(void)
{
unsigned char a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int len = 9;
volatile long crc = 0xFFFFFFFF;
while (len--)
{
crc = (crc >> 8) ^ (CRC32Table[(crc ^ a[9 - len]) & 0xFF]);
}
crc = crc ^ 0xFFFFFFFF;
unsigned long CRC32Table[256] = {0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, итд}
int main(void)
{
unsigned char a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int len = 9;
volatile long crc = 0xFFFFFFFF;
while (len--)
{
crc = (crc >> 8) ^ (CRC32Table[(crc ^ a[9 - len]) & 0xFF]);
}
crc = crc ^ 0xFFFFFFFF;
В результате CRC == 0xE1042295 (Эмуляция в AVR студии)
Теперь то же самое на Delphi
Код
// ====================================================
procedure TForm1.Button1Click(Sender: TObject);
const
tbl: array [0..255] of integer = ($00000000, $77073096, $EE0E612C, $990951BA, ...);
arr: array [0..8] of byte = (1,2,3,4,5,6,7,8,9);
var
crc, len: integer;
begin
len := 9;
crc := $FFFFFFFF;
while len > 0 do begin
crc := (crc shr 8) xor tbl[(crc xor arr[9 - len]) and $FF];
Dec(len);
end;
crc := crc xor $FFFFFFFF;
label1.Caption := inttostr(crc);
end;
procedure TForm1.Button1Click(Sender: TObject);
const
tbl: array [0..255] of integer = ($00000000, $77073096, $EE0E612C, $990951BA, ...);
arr: array [0..8] of byte = (1,2,3,4,5,6,7,8,9);
var
crc, len: integer;
begin
len := 9;
crc := $FFFFFFFF;
while len > 0 do begin
crc := (crc shr 8) xor tbl[(crc xor arr[9 - len]) and $FF];
Dec(len);
end;
crc := crc xor $FFFFFFFF;
label1.Caption := inttostr(crc);
end;
Здесь CRC = $40EFAB9E;
Кто виноват, а главное, что делать.
Забыл сказать - с вероятностью 99,9(9) правильный результат в Delphi т. к.
этот алгоритм был использован в старых проектах.