CRC32 - tablica dynamiczna

Twardy

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ą:

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 komentarzy

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...

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