一个C++及Delphi做的压缩程序

80酷酷网    80kuku.com

  { This is interface of C++ code.
  C++ source code not included to this archive.
  Look README.TXT file for more information. }

#ifndef __CODING_H__
#define __CODING_H__

#ifndef coding_impex
#define coding_impex __declspec(dllimport)
#endif

class coding_impex avlDecode
{
   public:
     ~avlDecode();
      avlDecode();

      virtual int ReadBuf            
                  ( void     *buf,   
                    unsigned  maxLen,
                    unsigned &rdlen  
                  ) = 0;             

      int  Get(void *buf, unsigned  maxLen);
      int  Get(void *buf, unsigned  maxLen, unsigned &rdLen)
      {  return ((int)(rdLen = Get(buf, maxLen)) < 0)? rdLen :0 ;
      }

      void Reset();

   private:

   ????????? private part not included ???????????????????

};


class coding_impex avlEncode
{
   public:
     ~avlEncode();
      avlEncode();

      virtual int WriteBuf           
                  ( void     *buf,   
                    unsigned  len    
                  ) = 0;             


      int  Put(void *buf, unsigned  n);
      void Reset();

   private:
  ?????????? Private part not icluded ?????????????

};

#endif //__CODING_H__


///encode.pas
{$M 8192,120000,120000}
uses avlcodes;

const BUFSIZE=60000;

var p: pointer;
    f,f1: file;
    s: string;
    buf: pointer;
    num: word;

{$F+}

Function WriteToFile(var buf; n: integer): integer;
var num: word;
Begin
BlockWrite(f1,buf,n,num);
End;

{$F-}

Begin
if not GetMemory then
  Begin
   WriteLn('Not enough memory in HEAP to compress file.');
   halt;
  End;
s:=paramstr(1);
SetEncodeOutBuffer(WriteToFile);
assign(f,s);
{$I-}
  if s<>'' then Reset(f,1);
{$I+}
if (IoResult<>0) or (s='') then
  Begin
   WriteLn;
   WriteLn('The author of this Turbo Pascal program and original C++ code is');
   WriteLn('Alexander Larkin   ( translated to Turbo Pascal from C++ on 27/09/1999 )');
   WriteLn;
   WriteLn('E-mail:      avlarkinwriteme.com');
   WriteLn('Internet:    http://www.geocities.com/SiliconValley/6235/tpdl.htm');
   WriteLn;
   WriteLn('Usage: encode.exe InFile OutFile [password]');
   WriteLn;
   FreeMemory;
   halt;
  End;
s:=paramstr(2);
Assign(f1,s);
{$I-}
if s<>'' then ReWrite(f1,1);
{$I+}
if (IoResult<>0) or (s='') then
  Begin
   Close(f);
   WriteLn('Cannot create find file '+s);
   FreeMemory;
   halt;
  End;
SetPassword(ParamStr(3));
  GetMem(buf,BUFSIZE);
   repeat
    BlockRead(f,buf^,BUFSIZE,num);
    EncodePut(buf^,num);
   until num<=0;
  if num<0 then WriteLn('Cannot compress file. You do something wrong.');
EncodeReset;
Close(f);
Close(f1);
FreeMemory;
End.

///decode.pas
{$M 8192,120000,120000}
uses avlcodes;

const BUFSIZE=60000;

var p: pointer;
    f,f1: file;
    s: string;
    buf: pointer;
    num: word;

{$F+}

Function ReadFromFile(var buf; n: integer; var rdlen: integer): integer;
Begin
BlockRead(f,buf,n,rdlen);
ReadFromFile:=0;
End;

{$F-}

Begin
if not GetMemory then
  Begin
   WriteLn('Not enough memory in HEAP to decompress file.');
   halt;
  End;
s:=paramstr(1);
SetDecodeInBuffer(ReadFromFile);
assign(f,s);
{$I-}
  if s<>'' then Reset(f,1);
{$I+}
if (IoResult<>0) or (s='') then
  Begin
   WriteLn;
   WriteLn('The author of this Turbo Pascal program and original C++ code is');
   WriteLn('Alexander Larkin   ( translated to Turbo Pascal from C++ on 27/09/1999 )');
   WriteLn;
   WriteLn('E-mail:      avlarkinwriteme.com');
   WriteLn('Internet:    http://www.geocities.com/SiliconValley/6235/tpdl.htm');
   WriteLn;
   WriteLn('Usage: decode.exe InFile OutFile [password]');
   WriteLn;
   FreeMemory;
   halt;
  End;
s:=paramstr(2);
Assign(f1,s);
{$I-}
if s<>'' then ReWrite(f1,1);
{$I+}
if (IoResult<>0) or (s='') then
  Begin
   Close(f);
   WriteLn('Cannot create file '+s);
   FreeMemory;
   halt;
  End;
  GetMem(buf,BUFSIZE);
  SetPassword(ParamStr(3));
   repeat
    num:=DecodeGet(buf^,BUFSIZE);
    if num<65535 then BlockWrite(f1,buf^,num,num);
   until (num=0) or (num=65535);
if num=65535 then WriteLn('Error! Data corrupted. Cannot decompress file.');
Close(f);
Close(f1);
FreeMemory;
End.


分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: