Solved

Zip And CRC

Posted on 2001-07-06
6
372 Views
Last Modified: 2010-08-05
Does anyone know how Zip works, and his CRC.
I need details...

Thanks...
0
Comment
Question by:Yevgen
6 Comments
 
LVL 7

Expert Comment

by:Motaz
Comment Utility
I have CRC code:

--------------------

UNIT CRC32;

 (* Comment below is the development history of this unit *)

 {CRC32 calculates a cyclic redundancy code (CRC), known as CRC-32, using
  a byte-wise algorithm.

  (C) Copyright 1989, 1995-1996 Earl F. Glynn, Overland Park, KS.
  All Rights Reserved.

  This UNIT was derived from the CRCT FORTRAN 77 program given in
  "Byte-wise CRC Calculations" by Aram Perez in IEEE Micro, June 1983,
  pp. 40-50.  The constants here are for the CRC-32 generator polynomial,
  as defined in the Microsoft Systems Journal, March 1995, pp. 107-108

  This CRC algorithm emphasizes speed at the expense of the 512 element
  lookup table.}

 { In 1999, This unit updated by Motaz Abdel Azim, motaz1@yahoo.com }
 { The update include ability of getting CRC of any part of file by }
 { adding BytesFromStart and BytesBeforEnd, if both of them are 0, the }
 { CRC code of entire file will be returned }


Interface

Function GetFileCRC (FileName: string;var CRCvalue:  LongInt;
         BytesFromStart, BytesBeforEnd: LongInt): integer;
procedure CalcCRC32 (var Buf: array of byte; nbyte: word;
          var CRCvalue: LongInt);

Implementation

const
    table:  array[0..255] of LongWord =
   ($00000000, $77073096, $EE0E612C, $990951BA,
    $076DC419, $706AF48F, $E963A535, $9E6495A3,
    $0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988,
    $09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91,
    $1DB71064, $6AB020F2, $F3B97148, $84BE41DE,
    $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7,
    $136C9856, $646BA8C0, $FD62F97A, $8A65C9EC,
    $14015C4F, $63066CD9, $FA0F3D63, $8D080DF5,
    $3B6E20C8, $4C69105E, $D56041E4, $A2677172,
    $3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B,
    $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940,
    $32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59,
    $26D930AC, $51DE003A, $C8D75180, $BFD06116,
    $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F,
    $2802B89E, $5F058808, $C60CD9B2, $B10BE924,
    $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D,

    $76DC4190, $01DB7106, $98D220BC, $EFD5102A,
    $71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433,
    $7807C9A2, $0F00F934, $9609A88E, $E10E9818,
    $7F6A0DBB, $086D3D2D, $91646C97, $E6635C01,
    $6B6B51F4, $1C6C6162, $856530D8, $F262004E,
    $6C0695ED, $1B01A57B, $8208F4C1, $F50FC457,
    $65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C,
    $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65,
    $4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2,
    $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB,
    $4369E96A, $346ED9FC, $AD678846, $DA60B8D0,
    $44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9,
    $5005713C, $270241AA, $BE0B1010, $C90C2086,
    $5768B525, $206F85B3, $B966D409, $CE61E49F,
    $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4,
    $59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD,

    $EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A,
    $EAD54739, $9DD277AF, $04DB2615, $73DC1683,
    $E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8,
    $E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1,
    $F00F9344, $8708A3D2, $1E01F268, $6906C2FE,
    $F762575D, $806567CB, $196C3671, $6E6B06E7,
    $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC,
    $F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5,
    $D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252,
    $D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B,
    $D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60,
    $DF60EFC3, $A867DF55, $316E8EEF, $4669BE79,
    $CB61B38C, $BC66831A, $256FD2A0, $5268E236,
    $CC0C7795, $BB0B4703, $220216B9, $5505262F,
    $C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04,
    $C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D,

    $9B64C2B0, $EC63F226, $756AA39C, $026D930A,
    $9C0906A9, $EB0E363F, $72076785, $05005713,
    $95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38,
    $92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21,
    $86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E,
    $81BE16CD, $F6B9265B, $6FB077E1, $18B74777,
    $88085AE6, $FF0F6A70, $66063BCA, $11010B5C,
    $8F659EFF, $F862AE69, $616BFFD3, $166CCF45,
    $A00AE278, $D70DD2EE, $4E048354, $3903B3C2,
    $A7672661, $D06016F7, $4969474D, $3E6E77DB,
    $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0,
    $A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9,
    $BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6,
    $BAD03605, $CDD70693, $54DE5729, $23D967BF,
    $B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94,
    $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D);


procedure CalcCRC32 (var Buf: array of byte; nbyte:
  word; var CRCvalue: LongInt);
   {The following is a little cryptic (but executes very quickly).
    The algorithm is as follows:
      1.  exclusive-or the input byte with the low-order portion of
          the CRC register to get an INDEX
      2.  shift the CRC register eight bits to the right
      3.  exclusive-or the CRC register with the contents of
          Table[INDEX]
      4.  repeat steps 1 through 3 for all bytes}
var
  i: LongInt;
begin
  for i:= 0 to nBYTE-1 do
    CRCvalue := (LongWord(CRCvalue) shr 8)  xor
      Table[Buf[i] xor (CRCvalue and $000000FF)]
end;

(*********************  Get file CRC  *******************)

Function GetFileCRC(FileName: string; var CRCvalue:  LongInt;
            BytesFromStart, BytesBeforEnd: LongInt): integer;
var
  BytesRead: integer;
  F: file;
  Buf: array [0..1023] of byte;
  FSize, TotalBytes, MustRead: integer;
  Error: integer;
begin
  FileMode := 0;  (*** Read only access ***)
  CRCValue := -1;
  AssignFile(F, FileName);
  {$I-}
  Reset(F, 1);
  {$I+}
  Error := IOResult;
  IF Error <> 0 then
  begin
    GetFileCRC:= Error;
    exit;
  end;
  TotalBytes := 0;
  FSize:= FileSize(F)-BytesFromStart-BytesBeforEnd;

  Seek(F, BytesFromStart); (*** Bypass file header ***)
  MustRead:= SizeOf(Buf);

  repeat
    if TotalBytes+MustRead > FSize then
      MustRead:= FSize-TotalBytes;
    {$i-}
    BlockRead(F, Buf, MustRead, BytesRead);
    {$i+}
    Error:= IOResult;
    if Error <> 0 then
    begin
      CloseFile(F);
      GetFileCRC:= Error;
      Exit;
    end;
    CalcCRC32(Buf, BytesRead, CRCvalue);
    Inc(TotalBytes, BytesRead)
  until TotalBytes >= FSize;

  CloseFile(F);
  CRCvalue := NOT CRCvalue;
  GetFileCRC :=0; (*** Successed ***)
end;

end.


----------------------

This is an example of using CRC32.pas unit:

- Add CRC32 to Uses clause.
- Write this code:

Var
  Err: integer;
  CRC: integer;
begin
  Err:= GetFileCRC('c:\command.com', CRC,
         0, 0);
  if Err <> 0 then
   ShowMessage('Error while reading CRC code')
  else
    ShowMessage('File CRC code is: '+IntToStr(CRC));
end;

Very simple! isn't it ?

GetFileCRC function declared as:

Function GetFileCRC(FileName: string;
   var CRCvalue:  LongInt;
   BytesFromStart,
   BytesBeforEnd: LongInt): integer;
 
BytesFromStart and BytesBeforEnd enables you get file CRC code for any part of a file.  For example you can get file CRC without first 10 bytes:

  GetFileCRC('c:\command.com', CRC, 10, 0);

If you want to get file CRC except last 4 bytes you can write:

  GetFileCRC('c:\command.com', CRC, 0, 4);


Motaz
www.geocities.com/motaz1
0
 

Author Comment

by:Yevgen
Comment Utility
I didnt understand a thing, i asked how does WinZip work and WHAT is CRC...
0
 

Accepted Solution

by:
felonious earned 100 total points
Comment Utility
Not getting technical (because I really don't know much beyond what I write here) WinZip and most other compression programs have 'tables' that contain strings of bytes that seem to happen a lot in data files (or whatever it is you're compressing).  If winzip finds one of these patterns it can then substitute in a predefined code that is smaller (byte wise) then the original string of bytes.  On uncompression, winzip can look for these codes and put the strings back in.  There is definately more to it then this, but I am no compression expert.  

CRC is a calculated value that will be different for all combinations of bytes.  so CRC for 'AVA' is different then CRC for 'ABA' and even the CRC for 'aba'.  WinZip, on compressing a file, can then calculate a CRC for it, and then put the CRC in the ZIP file.  On uncompression WinZip will uncompress the file, generate a CRC for that file and compair it to the orginal CRC.

Hope this helps.

felonious
0
How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

 

Expert Comment

by:felonious
Comment Utility
by the way Motaz, very nice CRC32 unit :)

felonious
0
 
LVL 49

Expert Comment

by:DanRollins
Comment Utility
Hi Yevgen,
You've requested to delete this question, but its status remains as 'Pending Delete' because one or more comments have been added.  Normally, the only way to fully delete such a Question is to post a message to Community Support and ask for assistance.

EE is making a one-time database sweep to purge the Pending Delete Questions automatically.  During this sweep:

    Yevgen -- To allow the deletion to proceed:  Do nothing.
    EXPERTS -- Please DON'T POST a comment except to contest this deletion.

In the future, please refer to http://www.experts-exchange.com/jsp/cmtyHelpDesk.jsp#8 for instruction on deleting questions.

DanRollins -- EE database cleanup volunteer
0
 
LVL 1

Expert Comment

by:Moondancer
Comment Utility
Finalized.
Moondancer - EE Moderator
0

Featured Post

6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

Join & Write a Comment

Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
It is a freely distributed piece of software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages.
This video discusses moving either the default database or any database to a new volume.

743 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now