Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.02.2009, 17:07
Aндрей Aндрей вне форума
Прохожий
 
Регистрация: 16.02.2009
Адрес: Брянск
Сообщения: 34
Репутация: 10
По умолчанию Контрольная сумма

Помогите мне пожалуйста посчитать контрольную сумму.
Я в ините находил разные алгоритмы, но по ним контрольные суммы не совпадают с контрольными суммами в TotalCommander.. Может компонент специальный нужен..
Ответить с цитированием
  #2  
Старый 17.02.2009, 17:38
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,090
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Есть несколько алгоритмов расчета. Какой тебя интересует?

ЗЫ. А ты точно уверен в том, какой алгоритм используется в Total Commander?
Ответить с цитированием
  #3  
Старый 17.02.2009, 17:39
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

вот CRC:
Код:
function GetCRC(FName: string): DWORD;
var
  F: HWND;
  L, nSize: DWORD;
  Buffer: array[0..512] of Byte;
  i: integer;
begin
  F:= CreateFile(PChar(FName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
  L:= 0;
  while nSize > 0 do
  begin
    ReadFile(F, Buffer, SizeOf(Buffer), nSize, nil);
    for i:=0 to nSize-1 do L:= L+Buffer[i];
  end;
  CloseHandle(F);
  Result:= L;
end;

и CRC32:
Код:
const
  CRCPOLY = $EDB88320;

var
  CRCTable: array[0..512] of Longint;

procedure BuildCRCTable;
var
  i, j: Word;
  r: DWORD;
begin
  FillChar(CRCTable, SizeOf(CRCTable), 0);
  for i:= 0 to 255 do
  begin
    r:= i shl 1;
    for j:= 8 downto 0 do
      if (r and 1) <> 0 then
        r:= (r Shr 1) xor CRCPOLY
      else
        r:= r shr 1;
    CRCTable[i]:= r;
  end;
end;

function RecountCRC(b: byte; CrcOld: Longint): Longint;
begin
  RecountCRC:= CRCTable[byte(CrcOld xor Longint(b))] xor ((CrcOld shr 8) and $00FFFFFF)
end;

function GetCRC32(FileName: string): DWORD;
var
  Buffer: PChar;
  f: File of Byte;
  b: array[0..255] of Byte;
  CRC: DWORD;
  e, i: Integer;
begin
  BuildCRCTable;
  CRC:= $FFFFFFFF;
  AssignFile(F, FileName);
  FileMode:= 0;
  Reset(F);
  GetMem(Buffer, SizeOf(B));
  repeat
    FillChar(b, SizeOf(b), 0);
    BlockRead(F, b, SizeOf(b), e);
    for i := 0 to (e-1) do
     CRC:= RecountCRC(b[i], CRC);
  until (e < 255) or (IOresult <> 0);
  FreeMem(Buffer, SizeOf(B));
  CloseFile(F);
  CRC:= Not CRC;
  Result:= CRC;
end;
Ответить с цитированием
  #4  
Старый 18.02.2009, 18:51
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
По умолчанию Контрольная сумма

В Total Commander считается CRC32 контрольная сумма.
Вот исходник программки которая это делает
(Чтобы посчитать, просто перетащи нужный файл на форму проги )
Вложения
Тип файла: rar CRC32.rar (12.8 Кбайт, 55 просмотров)
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:38.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025