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