ZipHelper 修正
在我前面的“压缩与解压缩 ZipHelper ”一文中提到了使用ICSharpCode.SharpZipLib.dll库的BZip2OutputStream和BZip2InputStream 来进行数据流的压缩。这几天在我的AgileIM的测试中发现使用BZip2OutputStream和BZip2InputStream 来进行压缩/解压缩并不可靠,有时会出现这样的情况:对A进行压缩得到B,然后对B解压缩,得到C的却与A不等,通常的情况是,C只是A的首部的一部分。我没有研究ICSharpCode.SharpZipLib的源码,所以还没发现是什么原因造成了这种情况。
幸运的是,我发现了一个更好的替代品--仍然是ICSharpCode.SharpZipLib类库中的一个类--BZip2,这个类的使用更方便,而且经过我的不完全测试,其运行的结果是可靠的。所以将ZipHelper的实现修正如下:
1 public class ZipHelper
2 {
3 public static byte[] Zip(byte[] data)
4 {
5 return Zip(data ,0 ,data.Length) ;
6 }
7
8 public static byte[] Unzip(byte[] data)
9 {
10 return Unzip(data ,0 ,data.Length) ;
11 }
12
13 public static byte[] Zip(byte[] data ,int offset ,int size)
14 {
15 MemoryStream inStream = new MemoryStream(data ,offset ,size);
16 MemoryStream outStream = new MemoryStream() ;
17 BZip2.Compress(inStream ,outStream ,size) ;
18
19 byte[] result = outStream.ToArray() ;
20 inStream.Close() ;
21 outStream.Close() ;
22
23 return result ;
24 }
25
26 public static byte[] Unzip(byte[] data ,int offset ,int size)
27 {
28 MemoryStream inStream = new MemoryStream(data ,offset ,size);
29 MemoryStream outStream = new MemoryStream() ;
30 BZip2.Decompress(inStream ,outStream ) ;
31
32 byte[] result = outStream.ToArray() ;
33 inStream.Close() ;
34 outStream.Close() ;
35
36 return result ;
37 }
38 }
2 {
3 public static byte[] Zip(byte[] data)
4 {
5 return Zip(data ,0 ,data.Length) ;
6 }
7
8 public static byte[] Unzip(byte[] data)
9 {
10 return Unzip(data ,0 ,data.Length) ;
11 }
12
13 public static byte[] Zip(byte[] data ,int offset ,int size)
14 {
15 MemoryStream inStream = new MemoryStream(data ,offset ,size);
16 MemoryStream outStream = new MemoryStream() ;
17 BZip2.Compress(inStream ,outStream ,size) ;
18
19 byte[] result = outStream.ToArray() ;
20 inStream.Close() ;
21 outStream.Close() ;
22
23 return result ;
24 }
25
26 public static byte[] Unzip(byte[] data ,int offset ,int size)
27 {
28 MemoryStream inStream = new MemoryStream(data ,offset ,size);
29 MemoryStream outStream = new MemoryStream() ;
30 BZip2.Decompress(inStream ,outStream ) ;
31
32 byte[] result = outStream.ToArray() ;
33 inStream.Close() ;
34 outStream.Close() ;
35
36 return result ;
37 }
38 }