Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];

Вниз

подсчёт CRC32 файла   Найти похожие ветки 

 
Fanny   (2005-07-13 22:10) [0]

делал кто-нить сабж?
есть вариант с SysUtils, Classes, Dialogs? но уж больно много места занимает


 
dmitry501 ©   (2005-07-14 05:22) [1]

{ **** UBPFD *********** by delphibase.endimus.ru ****
>> Быстрый алгоритм подсчета CRC32

Использован BASM.

Зависимости: нет
Автор:       Александр Шарахов, alsha@mailru.com, Москва
Copyright:   Александр Шарахов
Дата:        18 января 2003 г.
**************************************************** }

unit CRCunit;

interface
function GetNewCRC(OldCRC: cardinal; StPtr: pointer; StLen: integer): cardinal;
procedure UpdateCRC(StPtr: pointer; StLen: integer; var CRC: cardinal);
function GetZipCRC(StPtr: pointer; StLen: integer): cardinal;
function GetFileCRC(const FileName: string): cardinal;

implementation
var
 CRCtable: array[0..255] of cardinal;

function GetNewCRC(OldCRC: cardinal; StPtr: pointer; StLen: integer): cardinal;
asm
 test edx,edx;
 jz @ret;
 neg ecx;
 jz @ret;
 sub edx,ecx; // Address after last element

 push ebx;
 mov ebx,0; // Set ebx=0 & align @next
@next:
 mov bl,al;
 xor bl,byte [edx+ecx];
 shr eax,8;
 xor eax,cardinal [CRCtable+ebx*4];
 inc ecx;
 jnz @next;
 pop ebx;

@ret:
end;

procedure UpdateCRC(StPtr: pointer; StLen: integer; var CRC: cardinal);
begin
 CRC:=GetNewCRC(CRC,StPtr,StLen);
end;

function GetZipCRC(StPtr: pointer; StLen: integer): cardinal;
begin
 Result:=not GetNewCRC($FFFFFFFF, StPtr, StLen);
end;

function GetFileCRC(const FileName: string): cardinal;
const
 BufSize = 64*1024;
var
 Fi: file;
 pBuf: PChar;
 Count: integer;
begin
 Assign(Fi,FileName);
 Reset(Fi,1);
 GetMem(pBuf,BufSize);
 Result:=$FFFFFFFF;
 repeat
   BlockRead(Fi,pBuf^,BufSize,Count);
   if Count=0 then break;
   Result:=GetNewCRC(Result,pBuf,Count);
 until false;
 Result:=not Result;
 FreeMem(pBuf);
 CloseFile(Fi);
end;

procedure CRCInit;
var
 c: cardinal;
 i, j: integer;
begin
 for i:=0 to 255 do begin
   c:=i;
   for j:=1 to 8 do if odd(c) then c:=(c shr 1) xor $EDB88320 else c:=(c shr 1);
   CRCtable[i]:=c;
 end;
end;

initialization
 CRCinit;
end.


Использую для рабочего проекта с VCL. Для KOL могут потребоваться небольште переделки...


 
ECM ©   (2005-07-14 11:07) [2]

2Fanny
Интересно, а каким боком вычисление CRC32 может быть жестко привязано к SysUtils, Classes, Dialogs?
... :)


 
Fanny   (2005-07-14 13:43) [3]

2ECM
fmShareDenyNone
TFileStream


 
ECM ©   (2005-07-14 14:03) [4]

Потоковое чтение файла в KOL вызывает проблемы...?
...переделывается за пять минут...:)


 
ECM ©   (2005-07-14 14:05) [5]

Многие алгоритмы расчета CRC обычно требуют на входе поток байт
(по алгоритму бит...но это не так важно). Поэтому чтение файла
никак не относится (не должно относится!) к вычислению CRC...
ИМХО


 
Fanny   (2005-07-15 20:48) [6]

сделать-то сделал,
но почем-то разные значения получаются у одного и того же файла



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.037 c
14-1121328888
Juice
2005-07-14 12:14
2005.08.07
Перевод исходников C++ <--> Delphi


4-1118215991
kkostik
2005-06-08 11:33
2005.08.07
Drag&amp;Drop


1-1121886461
Juice
2005-07-20 23:07
2005.08.07
Как можно из главного потока завершить другой поток ?


4-1118395724
!Trinix
2005-06-10 13:28
2005.08.07
Форма


3-1120124765
Layner
2005-06-30 13:46
2005.08.07
Как определить тип столбца таблицы?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский