Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как вычислить CRC (контрольную сумму) для файла

Delphi , Синтаксис , Шифрование



Автор: http://www.swissdelphicenter.ch

function GetCheckSum(FileName: string): DWORD;
var
  F: file of DWORD;
  P: Pointer;
  Fsize: DWORD;
  Buffer: array[0..500] of DWORD;
begin
  FileMode := 0;
  AssignFile(F, FileName);
  Reset(F);
  Seek(F, FileSize(F) div 2);
  Fsize := FileSize(F) - 1 - FilePos(F);
  if Fsize > 500 then
    Fsize := 500;
  BlockRead(F, Buffer, Fsize);
  Close(F);
  P := @Buffer;
  asm
     xor eax, eax
     xor ecx, ecx
     mov edi , p
     @again:
       add eax, [edi + 4*ecx]
       inc ecx
       cmp ecx, fsize
     jl @again
     mov @result, eax
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(GetCheckSum('c:\Autoexec.bat')));
end;

Программа на языке Delphi для расчета контрольной суммы CRC (Cyclic Redundancy Check) для файла. Функция GetCheckSum принимает имя файла в качестве входного параметра и возвращает рассчитанную контрольную сумму.

Расшифровка кода:

  1. Функция открывает указанный файл в бинарном режиме (FileMode := 0) с помощью процедур AssignFile и Reset.
  2. Она перемещается к середине файла с помощью Seek(F, FileSize(F) div 2) и рассчитывает оставшийся размер файла (Fsize := FileSize(F) - 1 - FilePos(F)) путем вычитания текущей позиции файла из общего размера файла.
  3. Если оставшийся размер файла больше 500 байт, она обрезает буфер до 500 байт (if Fsize > 500 then Fsize := 500;).
  4. Она читает указанное количество байт (Fsize) из файла в буфер с помощью BlockRead(F, Buffer, Fsize) и закрывает файл с помощью Close(F).
  5. Код использует ассемблер для расчета контрольной суммы CRC.
    • Инструкция xor eax, eax инициализирует регистр аккредитора (EAX) в 0.
    • Инструкция xor ecx, ecx инициализирует регистр счетчика цикла (ECX) в 0.
    • Инструкция mov edi, p устанавливает индексный регистр (EDI) в адрес начала буфера (P).
    • Маркер @again является началом цикла, который рассчитывает контрольную сумму CRC. Он добавляет каждый байт из буфера (доступный через [edi + 4*ecx]) к аккредитору, увеличивает счетчик цикла и проверяет, обработал ли он все байты (cmp ecx, fsize jl @again). Если нет, то он прыгает обратно к началу цикла.
    • Когда цикл завершается, рассчитанная контрольная сумма хранится в @result.
  6. Функция GetCheckSum возвращает рассчитанную контрольную сумму в виде DWORD.

В процедуре примера Button1Click, код вызывает функцию GetCheckSum с именем файла 'c:\Autoexec.bat' и отображает полученную контрольную сумму с помощью ShowMessage.

Обратите внимание, что это реализация является специфичной для Delphi и может не быть совместимой с другими языками программирования или платформами. Кроме того, есть более эффективные и точные способы расчета контрольных сумм CRC, такие как использование встроенных функций или библиотек.

В статье описывается алгоритм вычисления контрольной суммы CRC для файла с помощью функции GetCheckSum на языке Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Шифрование ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 06:27:11/0.0032351016998291/0