Yevgen
asked on
Zip And CRC
Does anyone know how Zip works, and his CRC.
I need details...
Thanks...
I need details...
Thanks...
ASKER
I didnt understand a thing, i asked how does WinZip work and WHAT is CRC...
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
by the way Motaz, very nice CRC32 unit :)
felonious
felonious
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 https://www.experts-exchange.com/jsp/cmtyHelpDesk.jsp#8 for instruction on deleting questions.
DanRollins -- EE database cleanup volunteer
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 https://www.experts-exchange.com/jsp/cmtyHelpDesk.jsp#8 for instruction on deleting questions.
DanRollins -- EE database cleanup volunteer
Finalized.
Moondancer - EE Moderator
Moondancer - EE Moderator
--------------------
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
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
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
If you want to get file CRC except last 4 bytes you can write:
GetFileCRC('c:\command.com
Motaz
www.geocities.com/motaz1