请问、如何用delphi自代的压缩单元,将一些自定义的数据写入压缩文件,最重要的是不影响解压缩之后的数据

解决方案 »

  1.   

    Uses Zlib
    procedure TMyClass.CompressStream(var AinStream, AoutStream: TMemoryStream);
    var
      InpBuf, OutBuf: Pointer;
      InpBytes, OutBytes: Integer;
    begin
      InpBuf := nil;
      OutBuf := nil;
      try
        GetMem(InpBuf, AinStream.Size);
        AinStream.Position := 0;
        InpBytes := AinStream.Read(InpBuf^, AinStream.Size);
        CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes);
        AoutStream.Write(OutBuf^, OutBytes);
      finally
        if InpBuf <> nil then
          FreeMem(InpBuf);
        if OutBuf <> nil then
          FreeMem(OutBuf);
      end;
    end;procedure TMyClass.DecompressStream(var AinStream, AoutStream: TMemoryStream);
    var
      InpBuf, OutBuf: Pointer;
      OutBytes, sz: Integer;
    begin
      InpBuf := nil;
      OutBuf := nil;
      sz := AinStream.Size - AinStream.Position;
      if sz > 0 then
      try
        GetMem(InpBuf, sz);
        AinStream.Read(InpBuf^, sz);
        DecompressBuf(InpBuf, sz, 0, OutBuf, OutBytes);
        AoutStream.Write(OutBuf^, OutBytes);
      finally
        if InpBuf <> nil then
          FreeMem(InpBuf);
        if OutBuf <> nil then
          FreeMem(OutBuf);
      end;
      AoutStream.Position := 0;
    end;
      

  2.   

    最好不用外部控件,Zlib算法压缩已经很好了,我上面给你的那两个函数是可以直接用的,
    CompressStream(var AinStream, AoutStream: TMemoryStream);
    AinStream是输入流,要压缩的流,AoutStream是压缩后的流
    DecompressStream(var AinStream, AoutStream: TMemoryStream);是解压的过程
    这都是无损压缩,解压后是一模一样