Форум: "Основная";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизCRC Найти похожие ветки
← →
*pavel (2004-04-02 17:02) [0]Как вычислить CRC файла
← →
Семен Сорокин © (2004-04-02 17:41) [1]нашел в закромах
unit CRC32;
interface
uses Classes;
{Вычисляет CRC32 блока из прежнего значения. Это позволяет
обрабатывать большие массивы информации поблочно.
Перед обработкой первого блока CRC32 необходимо инициализировать единицами: CRC32:= not 0, а после обработки
последнего блока - инвертировать: CRC32:= not CRC32. Кстати, последнее
сделано только для того, чтобы генерировать всегда ненулевой CRC32 - этот
алгоритм происходит из Ethernet.}
procedure CRC32Next(const Data; {Блок в памяти, чей CRC32 нужно просчитать.}
const Count: Cardinal; {Размер блока.}
var CRC32: Cardinal {Текущее значение CRC32.});
{Вычисляет CRC32 блока Data размера Count.}
function CRC32Full(const Data; const Count: Cardinal): Cardinal;
{Вычисляет CRC32 потока, начиная с текущей позиции.}
function CRC32Stream(const Source: TStream; {Поток.}
Count: Integer; {Длина блока в потоке, CRC32 которого нужно посчитать.
Если нельзя столько прочитать, возникнет стандартное VCL-исключение
EReadError. Если Count отрицателен, он принимается равным размеру потока.}
const BufSize: Cardinal = 1024 {Размер буфера, д.б. положителен.}): Cardinal;
implementation
var
T: array [Byte] of Cardinal;
procedure CRC32Next(const Data; const Count: Cardinal; var CRC32: Cardinal);
var
MyCRC32, _i: Cardinal;
PData: ^Byte;
begin
PData:= @Data;
MyCRC32:= CRC32; {в цикле - не var-переменная: так быстрее}
for _i := 1 to Count do begin
MyCRC32 := MyCRC32 shr 8 xor T[MyCRC32 and $FF xor PData^];
Inc(PData)
end;
CRC32:= MyCRC32
end;
function CRC32Full(const Data; const Count: Cardinal): Cardinal;
begin
Result := 1;
CRC32Next(Data, Count, Result);
Result := not Result;
end;
function CRC32Stream(const Source: TStream; Count: Integer; const BufSize: Cardinal = 1024): Cardinal;
var
N: Cardinal;
Buffer: Pointer;
begin
if Count < 0 then
Count:= Source.Size;
GetMem(Buffer, BufSize);
try
Result := 1;
while Count <> 0 do begin
if Cardinal(Count) > BufSize then
N:= BufSize
else
N:= Count;
Source.ReadBuffer(Buffer^, N);
CRC32Next(Buffer^, N, Result);
Dec(Count, N)
end;
finally
FreeMem(Buffer)
end;
Result := not Result
end;
var
_i, _d, _j: Cardinal;
initialization
{заполним таблицу значениями}
for _i := 0 to 255 do begin
_d := _i;
for _j := 1 to 8 do
if Odd(_d) then
_d := _d shr 1 xor $EDB88320 {образующий полином}
else
_d := _d shr 1;
T[_i]:= _d
end;
end.
← →
VMcL © (2004-04-02 20:01) [2]>>*pavel (02.04.04 17:02)
Какой именно CRC? Даже такой ламер, как я, знаю про минимум два: CRC16 и CRC32, и, вроде, видел где-то алгоритм CRC64. Один из них тебе привел <Семен Сорокин © (02.04.04 17:41) [1]>
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.03 c