
17.02.2009, 17:39
|
 |
Активный
|
|
Регистрация: 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;
|