📄 crc.pas
字号:
xor bl, al
shl bx, 1
add ebx, edi
mov bx, [ebx]
xor bl, ah
mov ax, bx
loop @@loop
@@done:
mov Result, ax
pop edx
pop ecx
pop ebx
pop eax
pop edi
pop esi
{$ELSE}
lea di, CrcArcTab
push ds
pop es
push ds
lds si, Buffer
mov ax, InitCrc
mov cx, Length
or cx, cx
jz @@done
@@loop:
xor bx, bx
mov bl, al
lodsb
xor bl, al
shl bx, 1
mov bx, es:[di + bx]
xor bl, ah
mov ax, bx
loop @@loop
pop ds
@@done:
mov Result, ax
{$ENDIF}
end;
end;
function UpdateCRC32(InitCRC: LongInt; var Buffer;
{$IFDEF Win32} Length: LongInt {$ELSE} Length: Word {$ENDIF}): LongInt;
begin
asm
{$IFDEF Win32}
push esi
push edi
push eax
push ebx
push ecx
push edx
lea edi, Crc32Tab
mov esi, Buffer
mov ax, word ptr InitCRC
mov dx, word ptr InitCRC + 2
mov ecx, Length
or ecx, ecx
jz @@done
@@loop:
xor ebx, ebx
mov bl, al
lodsb
xor bl, al
mov al, ah
mov ah, dl
mov dl, dh
xor dh, dh
shl bx, 1
shl bx, 1
add ebx, edi
xor ax, [ebx]
xor dx, [ebx + 2]
loop @@loop
@@done:
mov word ptr Result, ax
mov word ptr Result + 2, dx
pop edx
pop ecx
pop ebx
pop eax
pop edi
pop esi
{$ELSE}
push ds
pop es
push ds
lea di, CRC32Tab
lds si, Buffer
mov ax, word ptr InitCRC
mov dx, word ptr InitCRC + 2
mov cx, Length
or cx, cx
jz @@done
@@loop:
xor bh, bh
mov bl, al
lodsb
xor bl, al
mov al, ah
mov ah, dl
mov dl, dh
xor dh, dh
shl bx, 1
shl bx, 1
xor ax, es:[di + bx]
xor dx, es:[di + bx + 2]
loop @@loop
@@done:
pop ds
mov word ptr Result, ax
mov word ptr Result + 2, dx
{$ENDIF}
end;
end;
function FileCRC16(FileName: String; var CRC16: Word): Boolean; { Return True if ok }
var
f: File;
p: Pointer;
FSize: LongInt;
{$IFNDEF Win32}
tmp: Word;
{$ENDIF}
begin
{$I+}
try
AssignFile(f, FileName);
Reset(f, 1);
FSize := FileSize(f);
if FSize <> 0 then
begin
{$IFDEF Win32}
GetMem(p, FSize);
BlockRead(f, p^, FSize);
CRC16 := UpdateCrc16(0, p^, FSize); {!}
FreeMem(p, FSize);
{$ELSE}
CRC16 := 0; { Usualy from zero }
while FSize <> 0 do
begin
if FSize > $FFFF then tmp := $FFFF else tmp := FSize;
dec(FSize, tmp);
GetMem(p, tmp);
BlockRead(f, p^, tmp);
CRC16 := UpdateCrc16(Crc16, p^, tmp); {!}
FreeMem(p, tmp);
end;
{$ENDIF}
GetMem(p, 2); { Finish XModem crc with two nulls }
FillChar(p^, 2, 0);
Crc16 := UpdateCrc16(Crc16, p^, 2);
FreeMem(p, 2);
end;
Result := True;
except
Result := False;
end;
try
CloseFile(f);
except
end;
{$I-}
end;
function FileCRCArc(FileName: String; var CRCArc: Word): Boolean; { Return True if ok }
var
f: File;
p: Pointer;
FSize: LongInt;
{$IFNDEF Win32}
tmp: Word;
{$ENDIF}
begin
{$I+}
try
AssignFile(f, FileName);
Reset(f, 1);
FSize := FileSize(f);
if FSize <> 0 then
begin
{$IFDEF Win32}
GetMem(p, FSize);
BlockRead(f, p^, FSize);
CRCArc := UpdateCrcArc(0, p^, FSize); {!}
FreeMem(p, FSize);
{$ELSE}
CRCArc := 0; { Usualy from zero }
while FSize <> 0 do
begin
if FSize > $FFFF then tmp := $FFFF else tmp := FSize;
dec(FSize, tmp);
GetMem(p, tmp);
BlockRead(f, p^, tmp);
CRCArc := UpdateCrcArc(CrcArc, p^, tmp); {!}
FreeMem(p, tmp);
end;
{$ENDIF}
end;
Result := True;
except
Result := False;
end;
try
CloseFile(f);
except
end;
{$I-}
end;
function FileCRC32(FileName: String; var CRC32: LongInt): Boolean; { Return True if ok }
var
f: File;
p: Pointer;
FSize: LongInt;
{$IFNDEF Win32}
tmp: Word;
{$ENDIF}
begin
{$I+}
try
AssignFile(f, FileName);
Reset(f, 1);
FSize := FileSize(f);
if FSize <> 0 then
begin
{$IFDEF Win32}
GetMem(p, FSize);
BlockRead(f, p^, FSize);
CRC32 := UpdateCrc32($FFFFFFFF, p^, FSize); {!}
FreeMem(p, FSize);
{$ELSE}
CRC32 := $FFFFFFFF; { Usualy }
while FSize <> 0 do
begin
if FSize > $FFFF then tmp := $FFFF else tmp := FSize;
dec(FSize, tmp);
GetMem(p, tmp);
BlockRead(f, p^, tmp);
CRC32 := UpdateCrc32(Crc32, p^, tmp); {!}
FreeMem(p, tmp);
end;
{$ENDIF}
CRC32 := not CRC32; { Finish 32 bit crc by inverting all bits }
end;
Result := True;
except
Result := False;
end;
try
CloseFile(f);
except
end;
{$I-}
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -