home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 November / Chip_2002-11_cd1.bin / zkuste / delphi / unity / d4567 / FIPCRC32.ZIP / CRC32.pas
Pascal/Delphi Source File  |  2002-08-15  |  6KB  |  220 lines

  1. {
  2. *** CRC 32 Optimized for speed ***
  3. *** by Filip Skalka, fip@post.cz ***
  4. *** August 2002 ***
  5. }
  6.  
  7. unit CRC32;
  8. interface
  9.  
  10.  function CalculateCRC32(var buffer;const size:longword):longword;
  11.  function CalculateCRC32Masked(var buffer;const size:longword):longword;
  12.  
  13. implementation
  14. uses sysutils;
  15.  
  16. type
  17.  TData=array [0..0] of byte;
  18.  
  19. const
  20.  CRC32Table:array [0..255] of longword=
  21.  ($00000000,$77073096,$EE0E612C,$990951BA,$076DC419,$706AF48F,$E963A535,$9E6495A3,
  22.   $0EDB8832,$79DCB8A4,$E0D5E91E,$97D2D988,$09B64C2B,$7EB17CBD,$E7B82D07,$90BF1D91,
  23.   $1DB71064,$6AB020F2,$F3B97148,$84BE41DE,$1ADAD47D,$6DDDE4EB,$F4D4B551,$83D385C7,
  24.   $136C9856,$646BA8C0,$FD62F97A,$8A65C9EC,$14015C4F,$63066CD9,$FA0F3D63,$8D080DF5,
  25.   $3B6E20C8,$4C69105E,$D56041E4,$A2677172,$3C03E4D1,$4B04D447,$D20D85FD,$A50AB56B,
  26.   $35B5A8FA,$42B2986C,$DBBBC9D6,$ACBCF940,$32D86CE3,$45DF5C75,$DCD60DCF,$ABD13D59,
  27.   $26D930AC,$51DE003A,$C8D75180,$BFD06116,$21B4F4B5,$56B3C423,$CFBA9599,$B8BDA50F,
  28.   $2802B89E,$5F058808,$C60CD9B2,$B10BE924,$2F6F7C87,$58684C11,$C1611DAB,$B6662D3D,
  29.   $76DC4190,$01DB7106,$98D220BC,$EFD5102A,$71B18589,$06B6B51F,$9FBFE4A5,$E8B8D433,
  30.   $7807C9A2,$0F00F934,$9609A88E,$E10E9818,$7F6A0DBB,$086D3D2D,$91646C97,$E6635C01,
  31.   $6B6B51F4,$1C6C6162,$856530D8,$F262004E,$6C0695ED,$1B01A57B,$8208F4C1,$F50FC457,
  32.   $65B0D9C6,$12B7E950,$8BBEB8EA,$FCB9887C,$62DD1DDF,$15DA2D49,$8CD37CF3,$FBD44C65,
  33.   $4DB26158,$3AB551CE,$A3BC0074,$D4BB30E2,$4ADFA541,$3DD895D7,$A4D1C46D,$D3D6F4FB,
  34.   $4369E96A,$346ED9FC,$AD678846,$DA60B8D0,$44042D73,$33031DE5,$AA0A4C5F,$DD0D7CC9,
  35.   $5005713C,$270241AA,$BE0B1010,$C90C2086,$5768B525,$206F85B3,$B966D409,$CE61E49F,
  36.   $5EDEF90E,$29D9C998,$B0D09822,$C7D7A8B4,$59B33D17,$2EB40D81,$B7BD5C3B,$C0BA6CAD,
  37.   $EDB88320,$9ABFB3B6,$03B6E20C,$74B1D29A,$EAD54739,$9DD277AF,$04DB2615,$73DC1683,
  38.   $E3630B12,$94643B84,$0D6D6A3E,$7A6A5AA8,$E40ECF0B,$9309FF9D,$0A00AE27,$7D079EB1,
  39.   $F00F9344,$8708A3D2,$1E01F268,$6906C2FE,$F762575D,$806567CB,$196C3671,$6E6B06E7,
  40.   $FED41B76,$89D32BE0,$10DA7A5A,$67DD4ACC,$F9B9DF6F,$8EBEEFF9,$17B7BE43,$60B08ED5,
  41.   $D6D6A3E8,$A1D1937E,$38D8C2C4,$4FDFF252,$D1BB67F1,$A6BC5767,$3FB506DD,$48B2364B,
  42.   $D80D2BDA,$AF0A1B4C,$36034AF6,$41047A60,$DF60EFC3,$A867DF55,$316E8EEF,$4669BE79,
  43.   $CB61B38C,$BC66831A,$256FD2A0,$5268E236,$CC0C7795,$BB0B4703,$220216B9,$5505262F,
  44.   $C5BA3BBE,$B2BD0B28,$2BB45A92,$5CB36A04,$C2D7FFA7,$B5D0CF31,$2CD99E8B,$5BDEAE1D,
  45.   $9B64C2B0,$EC63F226,$756AA39C,$026D930A,$9C0906A9,$EB0E363F,$72076785,$05005713,
  46.   $95BF4A82,$E2B87A14,$7BB12BAE,$0CB61B38,$92D28E9B,$E5D5BE0D,$7CDCEFB7,$0BDBDF21,
  47.   $86D3D2D4,$F1D4E242,$68DDB3F8,$1FDA836E,$81BE16CD,$F6B9265B,$6FB077E1,$18B74777,
  48.   $88085AE6,$FF0F6A70,$66063BCA,$11010B5C,$8F659EFF,$F862AE69,$616BFFD3,$166CCF45,
  49.   $A00AE278,$D70DD2EE,$4E048354,$3903B3C2,$A7672661,$D06016F7,$4969474D,$3E6E77DB,
  50.   $AED16A4A,$D9D65ADC,$40DF0B66,$37D83BF0,$A9BCAE53,$DEBB9EC5,$47B2CF7F,$30B5FFE9,
  51.   $BDBDF21C,$CABAC28A,$53B39330,$24B4A3A6,$BAD03605,$CDD70693,$54DE5729,$23D967BF,
  52.   $B3667A2E,$C4614AB8,$5D681B02,$2A6F2B94,$B40BBE37,$C30C8EA1,$5A05DF1B,$2D02EF8D);
  53.  
  54. {function CalculateCRC32(var buffer;const size:longword):longword;
  55. var i:integer;
  56.     data:tdata absolute buffer;
  57. begin
  58.  result:=0;
  59.  for i:=0 to size-1 do result:=(result shr 8) xor (CRC32Table[byte(result) xor data[i]]);
  60. end;}
  61.  
  62. function CalculateCRC32(var Buffer;const Size:longword):longword;
  63. asm
  64.  push esi
  65.  push edi
  66.  push ebx
  67.  
  68.  mov edi,edx
  69.  mov esi,eax
  70.  xor ebx,ebx
  71.  xor eax,eax
  72.  
  73.  mov ecx,edi
  74.  shr ecx,2
  75.  jecxz @Rest
  76.  
  77. @Loop:
  78.  mov edx,[esi]
  79.  
  80.  mov bl,al
  81.  xor bl,dl
  82.  shr eax,8
  83.  xor eax,dword ptr [CRC32table+ebx*4]
  84.  
  85.  mov bl,al
  86.  xor bl,dh
  87.  shr eax,8
  88.  xor eax,dword ptr [CRC32table+ebx*4]
  89.  
  90.  shr edx,16
  91.  
  92.  mov bl,al
  93.  xor bl,dl
  94.  shr eax,8
  95.  xor eax,dword ptr [CRC32table+ebx*4]
  96.  
  97.  mov bl,al
  98.  xor bl,dh
  99.  shr eax,8
  100.  xor eax,dword ptr [CRC32table+ebx*4]
  101.  
  102.  add esi,4
  103.  
  104.  loop @Loop
  105.  
  106. @Rest:
  107.  mov ecx,edi
  108.  and ecx,3
  109.  jecxz @End
  110.  
  111.  mov bl,al
  112.  xor bl,[esi]
  113.  shr eax,8
  114.  inc esi
  115.  xor eax,dword ptr [CRC32table+ebx*4]
  116.  loop @Loop
  117.  
  118. @End:
  119.  
  120.  pop ebx
  121.  pop edi
  122.  pop esi
  123. end;
  124.  
  125. {function CalculateCRC32Masked(var buffer;const size:longword):longword;
  126. var i:integer;
  127.     data:tdata absolute buffer;
  128. begin
  129.  result:=$ffffffff;
  130.  for i:=0 to size-1 do result:=(result shr 8) xor (CRC32Table[byte(result) xor data[i]]);
  131.  result:=result xor $ffffffff;
  132. end;}
  133.  
  134. function CalculateCRC32Masked(var Buffer;const Size:longword):longword;
  135. asm
  136.  push esi
  137.  push edi
  138.  push ebx
  139.  
  140.  mov edi,edx
  141.  mov esi,eax
  142.  xor ebx,ebx
  143.  mov eax,$ffffffff
  144.  
  145.  mov ecx,edi
  146.  shr ecx,2
  147.  jecxz @Rest
  148.  
  149. @Loop:
  150.  mov edx,[esi]
  151.  
  152.  mov bl,al
  153.  xor bl,dl
  154.  shr eax,8
  155.  xor eax,dword ptr [CRC32table+ebx*4]
  156.  
  157.  mov bl,al
  158.  xor bl,dh
  159.  shr eax,8
  160.  xor eax,dword ptr [CRC32table+ebx*4]
  161.  
  162.  shr edx,16
  163.  
  164.  mov bl,al
  165.  xor bl,dl
  166.  shr eax,8
  167.  xor eax,dword ptr [CRC32table+ebx*4]
  168.  
  169.  mov bl,al
  170.  xor bl,dh
  171.  shr eax,8
  172.  xor eax,dword ptr [CRC32table+ebx*4]
  173.  
  174.  add esi,4
  175.  
  176.  loop @Loop
  177.  
  178. @Rest:
  179.  mov ecx,edi
  180.  and ecx,3
  181.  jecxz @End
  182.  
  183.  mov bl,al
  184.  xor bl,[esi]
  185.  shr eax,8
  186.  inc esi
  187.  xor eax,dword ptr [CRC32table+ebx*4]
  188.  loop @Loop
  189.  
  190. @End:
  191.  
  192.  xor eax,$ffffffff
  193.  
  194.  pop ebx
  195.  pop edi
  196.  pop esi
  197. end;
  198.  
  199.  
  200. var s:string;
  201.     x:cardinal;
  202.  
  203. procedure test;
  204. const Size=128*1024*1024;
  205. var data:array of byte;
  206.     i:cardinal;
  207.     d:tdatetime;
  208. begin
  209.  setlength(data,size);
  210.  for i:=0 to size-1 do data[i]:=i;
  211.  d:=now;
  212.  x:=CalculateCRC32(data[0],Size);
  213.  s:=formatdatetime('hh:nn:ss;zzz',now-d);
  214. end;
  215.  
  216. begin
  217.  test;
  218. end.
  219.  
  220.