⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc.pas

📁 CRC 计算
💻 PAS
📖 第 1 页 / 共 2 页
字号:
         lodsb
         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 + -