Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.021 c
3-1079604460
bushmen
2004-03-18 13:07
2004.04.18
update openrowset


6-1076493154
dm37
2004-02-11 12:52
2004.04.18
Передача данных по TCP/IP


1-1081064638
Tack83
2004-04-04 11:43
2004.04.18
Управление цветом колонок TListView (vsReport)


1-1080806011
Domkrat
2004-04-01 11:53
2004.04.18
Ищу Control


3-1079593362
russko
2004-03-18 10:02
2004.04.18
Структура Файл-Сервер