Programowanie w języku Delphi » FAQ

CRC32 - tablica dynamiczna

  • 2007-07-05 15:29
  • 2 komentarze
  • 810 odsłon
  • Oceń ten tekst jako pierwszy
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 komentarze

jacek30k 2005-05-10 10:03

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

koval_s 2005-01-21 16:48

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