我现在想用Delphi 中自带的zlib算法进行一个字符串的压缩与解压缩,但不知怎么用,希望高手能够
提供完整的原代码,我希望是两个函数,一个是压缩函数,传入一个字符串返回一个被压缩的字符
串,一个是解压缩函数,传入一个被压缩过的字符串,返回一个原串,着急呀,不够还可以加分,万
分感激!!!

解决方案 »

  1.   

    去网上下载ZLib的完整版吧
    有Demo,已经封装好的,比起Dlphi自带那个好用的http://lysoft.7u7.net
      

  2.   

    对于短字符串压缩做测试没有多少意义,所以建议还是压缩流。
    下面是一个压缩OleVariant的,楼主自己去吧,里面是先转成流再压缩,所以楼主可以只看数据流压缩部分
    ====================================
    //压缩
    procedure PackStream(var Stream: OleVariant);
    var
      ZStream: TCompressionStream;
      InStream:TMemoryStream;
      TempStream:TMemoryStream;
      BStream:TMemoryStream;
      Param:OleVariant;
      p:Pointer;
      pi:Pointer;
      pj:Pointer;
      bSize:int64;
    begin
      InStream:=TMemoryStream.Create;
      BStream:=TMemoryStream.Create;
      TempStream:=TMemoryStream.Create;
      pi:=VarArrayLock(Stream);
      try
         TempStream.Write(pi^,VarArrayHighBound(Stream,1)+1);
         ZStream:=TCompressionStream.Create(cldefault, InStream);
         try
            ZStream.CopyFrom(TempStream,0);
         finally
            ZStream.Free;
         end;
         Param:=VarArrayCreate([0,InStream.Size-1+sizeof(bSize)],varByte);
         p:=VarArrayLock(Param);
         try
            pj:=Addr(bSize);
            bSize:=TempStream.Size;
            BStream.Write(pj^,sizeof(bSize));
            BStream.Position:=sizeof(bSize);
            InStream.Position:=0;
            BStream.CopyFrom(InStream,InStream.Size);
            bstream.Position:=0;
            BStream.Read(p^,BStream.Size);
         finally
            VarArrayUnlock(Param);
         end;
      finally
         VarArrayUnlock(Stream);
         InStream.Free;
         TempStream.Free;
         BStream.Free;
      end;
      Stream:=Param;
    end;
    //-----------------------------------------------
    //解压缩
    procedure UnPackStream(var Stream: OleVariant);
    var
      TempStream:TMemoryStream;
      OutStream:TMemoryStream;
      ZStream: TDecompressionStream;
      BStream:TMemoryStream;
      Param:OleVariant;
      p:Pointer;
      po:Pointer;
      bSize:int64;
      pj:Pointer;
    begin
      TempStream:=TMemoryStream.Create;
      BStream:=TMemoryStream.Create;
      OutStream:=TMemoryStream.Create;
      p:=VarArrayLock(Stream);
      try
         TempStream.Write(p^,VarArrayHighBound(Stream,1)+1);
         pj:=Addr(bSize);
         TempStream.Position:=0;
         TempStream.Read(pj^,sizeof(bSize));
         TempStream.Position:=sizeof(bSize);
         if TempStream.Size>0 then BStream.CopyFrom(TempStream,TempStream.Size-sizeof(bSize));
         BStream.Position:=0;
         ZStream:=TDecompressionStream.Create(BStream);
         zstream.Position:=0;
         try
            OutStream.CopyFrom(ZStream,bSize);
            Param:=VarArrayCreate([0,OutStream.Size-1],varByte);
            po:=VarArrayLock(Param);
            try
               OutStream.Position:=0;
               OutStream.Read(po^,OutStream.Size);
            finally
               VarArrayUnlock(Param);
            end;
         finally
            ZStream.Free;
         end;
      finally
         VarArrayUnlock(Stream);
         BStream.Free;
         OutStream.Free;
         TempStream.Free;
      end;
      Stream:=Param;
    end;
      

  3.   

    流都可以,字符串当然行了。
    流可以直接调一个文件LoadFromFile,
    也可以直接把字符串往里写的SetSize、Write
      

  4.   

    偶快真要昏了,幸好今天上海的温度还算可以,不那么高,湿度也不错,偶才庆幸挺过来^_^上面使用的是TMemoryStream,偶就用TMemoryStream吧,不过先告诉楼主一声,压缩以后的流并非所有都是可显示字符,中意可能有#0存在,所以返回的数据不能直接使用字符串类,不过可以转换成Base64编码。呵呵,这样子说的话,楼主又会头晕了……汗汗汗procedure TextToStream(const SourceText:String;DestStream:TStream);   
    begin
       DestStream.Write(PChar(SourceText)^,Length(SourceText));
    end;procedure StreamToText(SourceStream:TStream;var DestText:String);   
    begin
       SetLength(DestText,SourceStream.Size);
       SourceStream.Seek(0,0);
       SourceStream.Read(PChar(DestText)^,SourceStream.Size);
    end;再昏,这CSDN,咋贴个Base64编码代码都说偶骂人,无语……
      

  5.   

    下面这段代码是用Base64编码后的Base64编码代码,不知道哪地方又有啥不文明语言,真无语
    =====================================================
    PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
    PT09PT09PT09DQovL0Jhc2U2NLHgwuuzzNDyDQovL7G+zsS1xNb31rzKx8D708O7urPlx/gNCi8v
    wLS89cnZttRUU3RyZWFtwOC1xLLZ1/cNCi8v0tS78cihuPy437XE0KfCyg0KLy+xvs7EtbHW0LXE
    u7qz5cf4tPPQocno1sPWtQ0KLy/Kx86qwcuy4srU0Ke5+7b4yei2qLXEDQovL7nKyrnTw8qx1+66
    w72ruMPWtcnUuMTQodK7teMNCi8vDQovLyjT0cfpzOHKvjrQodDE0uez9ikNCg0KY29uc3QgQlVG
    RkVSX1NJWkUgPQk1MzgwOyAgICAgICAgICAgICAgIC8vu7qz5cf4tPPQobv5yv0NCmNvbnN0IEJV
    RkZFUl9TSVpFXzM9CUJVRkZFUl9TSVpFKig1NyswKTsgLy/V67bUtdqx4MLrNTe49tfWt/vM7bzT
    0ru7u9DQt/sNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy+5
    ytSktsHIobu6s+XH+M6qNTe1xM67yv0NCmNvbnN0IEJVRkZFUl9TSVpFXzQ9CUJVRkZFUl9TSVpF
    Kig3NisyKTsgLy+x4MLruvO1xLu6s+XH+LTz0KHU8s6qOg0KICAgICAgICAgICAgICAgICAgICAg
    ICAgICAgICAgICAgICAgICAgICAgICAvL9SktsHIobTz0KEgZGl2IDMgKiA0ICsgMiAqINDQyv0N
    CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8oNTcgZGl2IDMg
    KiA0ICsgMikqILv5yv0NCi8vQmFzZTY0wuux7Q0KY29uc3QgQmFzZTY0VGFibGU6QXJyYXlbMC4u
    NjNdIG9mIGNoYXI9KCdBJywnQicsJ0MnLCdEJywnRScsJ0YnLCdHJywnSCcsDQogICAgICAgICAg
    ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knLCdKJywnSycsJ0wnLCdNJywnTicsJ08n
    LCdQJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScsJ1InLCdT
    JywnVCcsJ1UnLCdWJywnVycsJ1gnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
    ICAgICAgICdZJywnWicsJ2EnLCdiJywnYycsJ2QnLCdlJywnZicsDQogICAgICAgICAgICAgICAg
    ICAgICAgICAgICAgICAgICAgICAgICAgJ2cnLCdoJywnaScsJ2onLCdrJywnbCcsJ20nLCduJywN
    CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycsJ3AnLCdxJywncics
    J3MnLCd0JywndScsJ3YnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
    ICd3JywneCcsJ3knLCd6JywnMCcsJzEnLCcyJywnMycsDQogICAgICAgICAgICAgICAgICAgICAg
    ICAgICAgICAgICAgICAgICAgJzQnLCc1JywnNicsJzcnLCc4JywnOScsJysnLCcvJw0KICAgICAg
    ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCi8vttS7urPlx/i9+NDQseDC6w0K
    ZnVuY3Rpb24gRW5jb2RlQmFzZTY0Q2hhcihWYWx1ZTpBcnJheSBvZiBjaGFyOw0KICAgICAgICAg
    ICAgICAgICAgICAgICAgICBMZW46aW50NjQpOlN0cmluZzsNCnZhcg0KICAgQnVmZmVyMTpBcnJh
    eVswLi5CVUZGRVJfU0laRV80XSBvZiBjaGFyOyAvL7HgwuvK5LP2u7qz5cf4DQogICBpMTppbnQ2
    NDsNCmJlZ2luDQogICBpMTo9MDsNCiAgIHdoaWxlIGkxPExlbiBkbw0KICAgYmVnaW4NCiAgICAg
    IC8vw7/I/bj21KSx4MLr19a3+86q0rvX6aOsseDC67PJzqrLxNfWt/sNCiAgICAgIC8vyKHUpLHg
    wuu12tK719a3+7XEx7DB+cLrzqrK5LP2wuu1xLXa0rvX1rf71Nqx4MLrse3W0LXEy/fS/brFDQog
    ICAgICAvL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
    X18NCiAgICAgIC8voaGhoaH9oe6h7qHuoe6h/Q0KICAgICAgLy+jsKOwo7GjsaOxo7GjsaOxo7Gj
    saOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxDQogICAgICAvL6GhoaGpwKH6oaGjsaGh
    oaGh+6nIqcCh+qGho7KhoaGhofupyKnAofqhoaOzoaGhoaH7qcgNCiAgICAgIC8voaGhoaO4o7ej
    tqO1o7Sjs6Oyo7GjuKO3o7ajtaO0o7OjsqOxo7ijt6O2o7WjtKOzo7KjsQ0KICAgICAgLy+jsKOw
    o7GjsaOxo7GjsaOxDQogICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
    LS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgIEJ1ZmZlcjFbaTEgZGl2IDU3KjIraTEgZGl2IDMraTEr
    MF06PUJhc2U2NFRhYmxlWygoaW50ZWdlcihWYWx1ZVtpMV0pIHNociAyKSBhbmQgJDAwM2YpXTsN
    Cg0KICAgICAgLy/IodSkseDC67Xa0rvX1rf7tcS688G9wuvT67Xatv7UpMLr19a3+7XEx7DLxMLr
    1+m6z86qyuSz9sLrtcS12rb+19a3+9TaseDC67Ht1tC1xMv30v26xQ0KICAgICAgLy9fX19fX19f
    X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQogICAgICAvL6Gh
    oaGhoaGhoaGhoaGhoaGh/aHuoe6h7qHuof0NCiAgICAgIC8vo7CjsKOxo7GjsaOxo7GjsaOxo7Gj
    saOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsQ0KICAgICAgLy+hoaGhqcCh+qGho7GhoaGh
    ofupyKnAofqhoaOyoaGhoaH7qcipwKH6oaGjs6GhoaGh+6nIDQogICAgICAvL6GhoaGjuKO3o7aj
    taO0o7OjsqOxo7ijt6O2o7WjtKOzo7KjsaO4o7ejtqO1o7Sjs6Oyo7ENCiAgICAgIC8voaGhoaGh
    oaGhoaGho7CjsKOxo7GjsaOxo7GjsQ0KICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
    LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICBCdWZmZXIxW2kxIGRpdiA1NyoyK2kx
    IGRpdiAzK2kxKzFdOj1CYXNlNjRUYWJsZVsoKEludGVnZXIoVmFsdWVbaTFdKSBhbmQgJDAwMDMp
    IHNobCA0KSBvciAoKEludGVnZXIoVmFsdWVbaTErMV0pIHNociA0KSBhbmQgJDAwMGYpXTsNCg0K
    ICAgICAgLy/IodSkseDC67Xatv7X1rf7tcS688vEwuvT67XayP3UpMLr19a3+7XEx7DBvcLr1+m6
    z86qyuSz9sLrtcS12sj919a3+9TaseDC67Ht1tC1xMv30v26xQ0KICAgICAgLy9fX19fX19fX19f
    X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQogICAgICAvL6GhoaGh
    oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh/aHuoe6h7qHuof0NCiAgICAgIC8vo7CjsKOxo7GjsaOx
    o7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsQ0KICAgICAgLy+hoaGhqcCh
    +qGho7GhoaGhofupyKnAofqhoaOyoaGhoaH7qcipwKH6oaGjs6GhoaGh+6nIDQogICAgICAvL6Gh
    oaGjuKO3o7ajtaO0o7OjsqOxo7ijt6O2o7WjtKOzo7KjsaO4o7ejtqO1o7Sjs6Oyo7ENCiAgICAg
    IC8voaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGho7CjsKOxo7GjsaOxo7GjsQ0KICAgICAgLy8tLS0t
    LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICBC
      

  6.   

    dWZmZXIxW2kxIGRpdiA1NyoyK2kxIGRpdiAzK2kxKzJdOj1CYXNlNjRUYWJsZVsoKChJbnRlZ2Vy
    KFZhbHVlW2kxKzFdKSBhbmQgJDAwMGYpIHNobCAyKSkgb3IgKChJbnRlZ2VyKFZhbHVlW2kxKzJd
    KSBzaHIgNikgYW5kICQwMDAzKV07DQoNCiAgICAgIC8vyKHUpLHgwuu12sj919a3+7XEuvPB+cLr
    zqrK5LP2wuu1xLXay8TX1rf71Nqx4MLrse3W0LXEy/fS/brFDQogICAgICAvL19fX19fX19fX19f
    X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCiAgICAgIC8voaGhoaGh
    oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaH9oe6h7qHuoe6h/Q0KICAgICAgLy+j
    sKOwo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxDQogICAg
    ICAvL6GhoaGpwKH6oaGjsaGhoaGh+6nIqcCh+qGho7KhoaGhofupyKnAofqhoaOzoaGhoaH7qcgN
    CiAgICAgIC8voaGhoaO4o7ejtqO1o7Sjs6Oyo7GjuKO3o7ajtaO0o7OjsqOxo7ijt6O2o7WjtKOz
    o7KjsQ0KICAgICAgLy+hoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGjsKOwo7Gj
    saOxo7GjsaOxDQogICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
    LS0tLS0tLS0tLS0tLS0NCiAgICAgIEJ1ZmZlcjFbaTEgZGl2IDU3KjIraTEgZGl2IDMraTErM106
    PUJhc2U2NFRhYmxlW0ludGVnZXIoVmFsdWVbaTErMl0pIGFuZCAkMDAzZl07DQoNCiAgICAgIEJ1
    ZmZlcjFbaTEgZGl2IDU3KjIraTEgZGl2IDMraTErNF06PWNocigwKTsgLy+7urPlx/jK5LP2tK69
    4cr4serWvg0KDQogICAgICBpZigoKGkxKzMpIG1vZCA1Nyk9MCkgdGhlbiAgICAgICAgICAgICAg
    ICAgIC8vw7+x4MLrNTfX1rf7zO2807u70NC72LO1t/sNCiAgICAgIGJlZ2luDQogICAgICAgICBC
    dWZmZXIxW2kxIGRpdiA1NyoyK2kxIGRpdiAzK2kxKzRdOj1jaHIoMTMpOzsNCiAgICAgICAgIEJ1
    ZmZlcjFbaTEgZGl2IDU3KjIraTEgZGl2IDMraTErNV06PWNocigxMCk7DQogICAgICBlbmQ7DQog
    ICAgICBpMTo9aTErMzsNCiAgIGVuZDsNCg0KICAgQnVmZmVyMVtCVUZGRVJfU0laRV80XTo9Y2hy
    KDApOyAvL86qQnVmZmVyIHRvIFN0cmluZyDUpNbDveHK+LHq1r4NCg0KICAgUmVzdWx0Oj1TdHJp
    bmcoQnVmZmVyMSk7DQplbmQ7还真有一大段发不上来
      

  7.   

    //对文件进行编码
    Procedure EncodeBase64File(FileName:String;
                               DestStream:TStream;
                               ShowMsg:Boolean=true);
    var
       SourceStream:TFileStream;
       Buffer:Array[0..BUFFER_SIZE_3] of char; //预读缓冲区
       ssLen:int64;
       DestString:String;
       p:Pointer;
       i:Int64;
       sLen:int64;
       StartTime,EndTime:TDateTime;
    begin
       ssLen:=0;
       //打开文件
       SourceStream:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite );
       StartTime:=Now();//开始计时
       try
          i:=0;
          while i<SourceStream.Size do
          begin
             ssLen:=SourceStream.Size-i;  //取文件剩余长度
             if(ssLen>BUFFER_SIZE_3)then  //如果超过预读缓冲取
                ssLen:=BUFFER_SIZE_3;     //则只读取缓冲区大小
             SourceStream.ReadBuffer(Buffer,ssLen);         sLen:=ssLen;
             case (ssLen mod 3) of   //是否为三的倍数,否则添'0'补齐
                2:
                   begin
                      Buffer[ssLen+0]:=chr(0);
                      Buffer[ssLen+1]:=chr(0);
                      sLen:=sLen+2;
                   end;
                1:
                   begin
                      Buffer[ssLen]:=chr(0);
                      Inc(sLen);
                   end;
             end;         //编码
             DestString:=EncodeBase64Char( Buffer,sLen);
             sLen:=Length(DestString);
             p:=PChar(DestString);         DestStream.Seek(0,soFromEnd);   //将编码后的数据
             DestStream.WriteBuffer(p^,sLen);//添加到末尾         i:=i+BUFFER_SIZE_3;
          end;      //当数据不足三位时,会使用0补齐,
          //如果将会导致乱码数据的出现,
          //由此在Base64编码当中规定,
          //不足的冲分在编码后需要使用'='字符
          //替换补齐的字符      ssLen:=4;                       //预置替换“补齐”的位置为最后两个
          if DestString[sLen]=chr(10) then//若最后添加的两个是换行回车符
             ssLen:=ssLen+2;              //则把位置往前移两位      case (SourceStream.Size mod 3) of
             1:
                begin
                   DestString:='==';
                   p:=PChar(DestString);
                   DestStream.Seek(2-ssLen,soFromEnd);
                   DestStream.WriteBuffer(p^,Length(DestString));
                end;
             2:
                begin
                   DestString:='=';
                   p:=PChar(DestString);
                   DestStream.Seek(3-ssLen,soFromEnd);
                   DestStream.WriteBuffer(P^,Length(DestString));
                end;
          end;      EndTime:=Now();          //结束计时      sLen:=SourceStream.Size; //取输入长度
          ssLen:=DestStream.Size;  //取输出长度   finally
          SourceStream.Free();
       end;   //显示编码报告
       if ShowMsg then
          MessageBox(GetActiveWindow(),PChar(
                     'File:'+FileName+chr(13)+chr(10)+
                     'Source File Length:'+IntToStr(sLen)+chr(13)+chr(10)+
                     'Dest Stream Length:'+IntTOStr(ssLen)+chr(13)+chr(10)+
                     'Start At:'+TimeToStr(StartTime)+chr(13)+chr(10)+
                     'Over  At:'+TimeToStr(EndTime)+chr(13)+chr(10)+
                     'Consumed:'+TimeToStr(EndTime-StartTime)),
                     'EncodeBase64 (File to Stream)',
                     MB_OK);
    end;