C# 压缩的缺陷

本文通过对比C# 2.0自带的System.IO.Compression.GZipStream与SharpZipLib的GZip压缩性能,发现System.IO.Compression库压缩后的文件大小较大且缺少文件名和时间信息。作者深入源码分析,揭示了System.IO.Compression在GZipHeader部分的硬编码导致的问题,并提供了测试代码进行验证。
摘要由CSDN通过智能技术生成
最近项目需要用到压缩,以前1.1的时候都用的第3方库,这次想尝试一下2.0带的 Compression库。
一用发现这个库压的东西偏大,而且没文件名没时间。

那么到底是为什么会这样呢,难道是我的使用有问题?

决定要搞搞明白,于是有了下面这段代码,用SharpZipLib和2.0自带的库做下对比,大家都采用Gzip压缩

使用2.0的库做压缩
         static  MemoryStream Deflate( byte [] data)
        
{
            MemoryStream memoryStream 
= new MemoryStream();

            
using (GZipStream gzip = new GZipStream(memoryStream, CompressionMode.Compress, true))
            
{
                gzip.Write(data, 
0, data.Length);
                gzip.Flush();
                gzip.Close();
            }


            
return memoryStream;
        }

使用SharpZipLib压缩
         static  MemoryStream DeflateUseSharpZipLib( byte [] data)
        
{
            MemoryStream memoryStream 
= new MemoryStream();

            
using (GZipOutputStream outStream = new GZipOutputStream(memoryStream))
            
{
                outStream.IsStreamOwner 
= false;
                outStream.Write(data, 
0, data.Length);
                outStream.Flush();
                outStream.Finish();
            }

            
return memoryStream;
        }

ok,之后看看我们的测试文件   1.pdf 3358kb

使用System.IO.Compression
testzip 1.pdf 0.zip 0
使用ICSharpCode.SharpZipLib.GZip
testzip 1.pdf 1.zip 1 

压缩后大小:
0.zip 2499kb(System)
1.zip 1612kb(SharpZipLib)

可以看到 ICSharpCode.SharpZipLib.GZip 压缩后1612kb,C# System.IO.Compression.GZipStream 压缩后大小2499kb

而且System.IO.Compression.GZipStream压缩的文件没文件名,时间也是不对的

那么是什么原因呢?
那就让我们跟踪看看

System.IO.Compression.GZipStream的实现

GZipStream类
        public   override   void  Write( byte [] array,  int  offset,  int  count)
        
{
            
if (this.deflateStream == null)
            
{
                
throw new ObjectDisposedException(null, SR.GetString("ObjectDisposed_StreamClosed"));
            }

            
this.deflateStream.Write(array, offset, count);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值