Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.032 c
14-1080070794
Добрые пчелы
2004-03-23 22:39
2004.04.18
ИМХО, фраза: "Сайту "Мастера Делфи" нужны рекламодатели"


3-1079700776
pashaz
2004-03-19 15:52
2004.04.18
Колонка DBEHGrid в виде ComboBox


3-1079891555
neVIP
2004-03-21 20:52
2004.04.18
Эксклюзивный доступ к базе


4-1076643766
Aleksey
2004-02-13 06:42
2004.04.18
ctrl+c, ctrl+v


1-1080627091
SisiusP
2004-03-30 10:11
2004.04.18
Прошу совета, как реализовать класс.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский