求一个对字符串进行压缩及解压缩的函数,要求压缩后的结果也是一个字符串.
  源字符串由英文字母和数字组成.找了好久了,总找不到,网上的都是一些二进制压缩的例子.

解决方案 »

  1.   

    你就不会改吗??
    uses
      ...,Zlib;function CompressString(Str: string): string;
    var
      instream: Tmemorystream;
      zstream: Tcompressionstream;
      outstream: Tmemorystream;
      size: integer;
    begin
      instream := Tmemorystream.Create;
      try
        instream.Write(Str[1], Length(Str));
        if instream.Size = 0 then exit;
        size := instream.size;
        outstream := Tmemorystream.create;
        zstream := Tcompressionstream.Create(clmax, outstream);
        try
          instream.SaveToStream(zstream);
          zstream.free;
          outstream.Position := 0;
          instream.clear;
          instream.WriteBuffer(size, sizeof(size));
          instream.CopyFrom(outstream, 0);
          instream.Position := 0;
          SetLength(Result, instream.Size);
          instream.ReadBuffer(Result[1], instream.Size);
        finally
          outstream.free;
        end;
      finally
        instream.Free;
      end;
    end;function DeCompressString(Str: string): string;
    var
      instream: Tmemorystream;
      zstream: Tdecompressionstream;
      outstream: Tmemorystream;
      size: integer;
      buffer: pchar;
    begin
      instream := Tmemorystream.Create;
      try
        instream.Write(Str[1], Length(Str));
        if instream.Size = 0 then exit;    instream.Position := 0;
        instream.ReadBuffer(size, sizeof(size));
        getmem(buffer, size);
        outstream := Tmemorystream.create;
        zstream := Tdecompressionstream.Create(instream);
        try
          zstream.Readbuffer(buffer^, size);
          outstream.WriteBuffer(buffer^, size);
          outstream.Position := 0;
          instream.clear;
          instream.CopyFrom(outstream, 0);
          instream.Position := 0;
          SetLength(Result, instream.Size);
          instream.ReadBuffer(Result[1], instream.Size);
        finally
          zstream.free;
          outstream.Free;
          freemem(buffer);
        end;
      finally
        instream.Free;
      end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      str: string;
    begin
      Str := CompressString('1234567890'); //压缩
      Caption := DeCompressString(str); //解压缩
    end;
      

  2.   

    那你就不能对不可见的字符串循环一下,取其ASCII码值吗
      

  3.   

    >>那你就不能对不可见的字符串循环一下,取其ASCII码值吗
    取了ASCII码那怎么还原?
      

  4.   

    介绍一下  
    aaaaa 6 77 bb--->5a16272b 即第1位代表有几个,第2 位是原字符楼上的算法应不错
      

  5.   

    回复人: steelxu5(人间漫步) ( ) 信誉:100  2005-07-05 22:42:00  得分: 0  
     
     
       介绍一下  
    aaaaa 6 77 bb--->5a16272b 即第1位代表有几个,第2 位是原字符楼上的算法应不错
      
    *********** 
    如果重复数少于单个数,那这个压缩还有何意义
      

  6.   

    paranoia190(190) 能不能贴出来看看?偶给100分
      

  7.   

    欢迎加入DELPHI 程序员群 1805366 参加技术讨论  !!
      

  8.   

    aaaaa 6 77 bb--->5a16272b 即第1位代表有几个,第2 位是原字符
    这样的压缩方式就是最基本的RLE压缩方法,对于一些特定的重复性高的文件来讲压缩起来压缩比很大,而如果重复性很低的情况,那么压缩比也非常的低,推荐楼主使用LZW压缩算法,这个压缩算法的压缩比很高,并且WinZIP和WinRAR都是使用LZW的改进算法
      

  9.   

    function pCryptStr(const s: string;const bEncrypt: boolean = True): string;
    var
      Key : Integer;
      i : integer;
      ps, pr : ^byte;
    begin
      Key := 9898;
      SetLength(Result, Length(s));
      ps := @s[1];
      pr := @Result[1];
      for i := 1 to length(s) do
      begin
        pr^ := ps^ xor (9898 shr 8);
        if bEncrypt
           then Key := (pr^ + Key) * 1234 + 5678
           else Key := (ps^ + Key) * 1234 + 5678;
        pr := pointer(integer(pr) + 1);
        ps := pointer(integer(ps) + 1);
      end
    end;