CRC32 - tablica dynamiczna
Zauważyłem, że artykuł dotyczący sumy kontrolnej CRC32 spotkał się z zainteresowaniem. Dlatego specjalnie dla zainteresowanych chciałbym do tego artykułu jeszcze coś dodać. A dokładnie chodzi mi o tablicę, która jest niezbędna do obliczenia sumy kontrolnej. Czy nie myśleliście o tym, aby taka tablica nie była statyczna tylko dynamiczna (statyczna zajmuje więcej miejsca w programie)? Okazuje się, że jest możliwe utworzenie takiej tablicy poprzez specjalny algorytm, który będzie generował liczby 32 bitowe dla całej tablicy, a wynik będzie identyczny jak oryginał (tutaj czytaj tablica statyczna, którą zaprezentowałem w poprzednim artykule). A robi się to tak:
deklarujemy tablice dynamiczną:
w programie przydzielamy pamięć:
i ostatecznie wywołujemy funkcje, którą nazwałem Make_CRC32Table. A wygląda ona tak:
I to wszystko. Na koniec nie zapomnijmy zwolnić pamięci poprzez Dispose(CRC32Table);
Zobacz też:
deklarujemy tablice dynamiczną:
Type PCRC32 = ^TCRC32; TCRC32 = array[0..255] OF longint; Var CRC32Table : PCRC32;
w programie przydzielamy pamięć:
New(CRC32Table);
i ostatecznie wywołujemy funkcje, którą nazwałem Make_CRC32Table. A wygląda ona tak:
Procedure Make_CRC32Table; CONST CRCPOLY = $EDB88320; UCHAR_MAX = 255; CHAR_BIT = 8; var i, j: word; r: Longint; begin for i:=0 to UCHAR_MAX do begin r := i; for j := CHAR_BIT downto 1 do if (r and 1) > 0 then r:=(r shr 1) xor CRCPOLY else r := r shr 1; CRC32Table[i] := r; end; end;
I to wszystko. Na koniec nie zapomnijmy zwolnić pamięci poprzez Dispose(CRC32Table);
Zobacz też:
2 komentarze
Wiem że to późno ten komentarz, ale wcześniej to mnie nie interesiło, teraz mnie właśnie interesi, szukałem po całym świecie, a rozwiązanie na własnym podwórku, jak zwykle: "Cudze chwalicie, swego nie znacie" - piję oczywiście do samego siebie
Znalazłem kiedyś taki opis gdzieś na tym FAQ, nie mapiętam ale wiem, że jest tam błąd. a dokładnie jest złe CRC dla plików większych od 3 mega.. nie doszedłem dlaczego poprostu CRC jest albo z \'+\' albo \'-\' a rzeczywiste jest odwrotne...