一个典型应用中,使用delphi作为客户端,J2EE服务端,两者之间用XML作为数据交换,为了提高效率,对XML数据进行压缩,为此需要找到一种压缩/解压算法能够两个平台之间交互处理,使用ZLIB算法就是一个不错的解决方案。

1、JAVA实现

在JDK中,在java.util.zip包中已经内置了ZLIB的实现,示例代码如下:




1//解压 2 public String decompressData(String encdata) { 3 try { 4 ByteArrayOutputStream bos = new ByteArrayOutputStream();  5 InflaterOutputStream zos = new InflaterOutputStream(bos);  6 zos.write(convertFromBase64(encdata));  7 zos.close();  8 return new String(bos.toByteArray());  9 } catch (Exception ex) { 10 ex.printStackTrace();  11 return "UNZIP_ERR";  12 } 13 } 14 15 //压缩 16 public String compressData(String data) { 17 try { 18 ByteArrayOutputStream bos = new ByteArrayOutputStream();  19 DeflaterOutputStream zos = new DeflaterOutputStream(bos);  20 zos.write(data.getBytes());  21 zos.close();  22 return new String(convertToBase64(bos.toByteArray()));  23 } catch (Exception ex) { 24 ex.printStackTrace();  25 return "ZIP_ERR";  26 } 27 }




2、DELPHI中的实现

在DELPHI中,有第3方的控件可以利用来实现压缩/解压,这里我们选择VCLZIP V3.04,可以从这里下载http://www.vclzip.net。为了提高通用性,我们可以编写一个标准的DLL,就可以在Win32平台随意调用了,关键代码如下:




function Cmip_CompressStr(txt: PChar): pchar; stdcall;  var zip: TVclZip;  compr: string;  data: PChar;  begin zip := TVclZip.Create(nil);  compr := zip.ZLibCompressString(txt);  data := pchar(Base64EncodeStr(compr));  Result := StrNew(data);  zip.Free end;   function Cmip_DeCompressStr(txt: PChar): pchar; stdcall;  var zip: TVCLUnZip;  compr: string;  data: PChar;  begin zip := TVCLUnZip.Create(nil);  compr := zip.ZLibDecompressString(Base64DecodeStr(txt));  data := StrNew(pchar(compr));  Result := data;  zip.Free end;