C# 关于GZipStream压缩与解压缩数据丢失问题

原创 2015年11月18日 10:39:43

网上有很多关于GZipStream压缩与解压缩的例子,开始测试没问题,但我不习惯直接用别人的代码,少不了左改右改。改来改去问题来了,数据解压缩还原不出来了。看人家的例子和我的也没差哪去啊,为什么我的就还原不出来了。翻来覆去找原因,发现有的压缩时候就丢失了,有的是还原时候出错了。遇到压缩比较少的内容时候,还读不出压缩内容。难道GZipStream对压缩内容大小有限制 0.0  绝对不可能的,继续找原因!!!

然后发现用FileStream和GZipStream搭配能稍微好点,但是也出问题。最后上网继续找资料。http://bbs.csdn.net/topics/330249113,终于发现是我忽略了GZipStream关闭释放的位置的原因。

这是原来的代码

            string rawStr = "的花洒觉得会撒娇的还是骄傲的好久撒活动就撒谎的叫撒"; /// 要压缩的内容
            MemoryStream ms = new MemoryStream();                                 /// 不使用FileStream而是用MemoryStream承载
            GZipStream gzip = new GZipStream(ms, CompressionMode.Compress);       /// 初始化<span style="font-family: Arial, Helvetica, sans-serif;">GZipStream</span>
            byte[] rawData = Encoding.UTF8.GetBytes(rawStr);                      /// 写入要压缩的数据
            gzip.Write(rawData, 0, rawData.Length);
            byte[] result = ms.ToArray();                                         ///<span style="font-family: Arial, Helvetica, sans-serif;"> 重点就在这里,其实这一句应该放到 gzip.Dispose();的后面</span>
            gzip.Dispose();                                                       /// 关闭释放
            ms.Dispose();                                                         /// 关闭释放
            return result;                                                        /// 返回压缩内容

其实,当我们执行这句时候

gzip.Write(rawData, 0, rawData.Length);

gzip只是把内容编码,放在自己的缓存中,并没有向MemoryStream中写入,因为还没有达到gzip的缓存极限。所以这时候如果我们去MemoryStream中去取编码结果,不是少了一部分就是结果为0字节。

而执行

gzip.Dispose();  
这句,就会使gzip把缓存中余下的内容全部写入MemoryStream中。所以一定要在gzip流释放之后去承载对象中读取数据或判断数据大小。这样取得的结果才是真实的。



相关文章推荐

C# GZip、Deflate 压缩解压算法函数

///         /// GZip解压函数         ///         ///         ///         public byte[] GZipDeco...

C# GZip对字符串压缩和解压

下面是写的一个对字符串GZip压缩和解压帮助类,把全部代码贴出来: using System; using System.Collections.Generic; using System.Linq...

C# 压缩和解压缩(Gzip和Zip的方式)

使用ICSharpCode.SharpZipLib.dll来压缩/解压(压缩效率比GZip要高一点) public static class ZipUtil     {         ...

C# 压缩和解压缩(Gzip和Zip的方式)

使用ICSharpCode.SharpZipLib.dll来压缩/解压(压缩效率比GZip要高一点) public static class ZipUtil     {         /// ...
  • csharp25
  • csharp25
  • 2011年09月27日 20:28
  • 12863

c# 使用GZipStream压缩和解压流

///         /// 压缩流         ///         ///         ///         public  Stream DecompressSt...
  • wsc449
  • wsc449
  • 2012年01月07日 14:20
  • 8389

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

关于Java的GZIP压缩与.net C#的GZIP压缩的差异

关于Java的GZIP压缩与.net C#的GZIP压缩的差异

C# GZipStream

using System.IO; using System.IO.Compression; using System.Text; class Program { static void Ma...

C#中将字符串通过GZipStream进行压缩时的注意事项

背景, 今天在写代码时要用到GZipStream来压缩需要Web传输的数据块。原本以为GZipStream Write ->Flush ->读取对应MemoryStream数据就Okay的事情,却总...

如何压缩多个文件/文件夹(GZipStream and C#)

转自:http://www.cnblogs.com/AndyHuang/archive/2009/02/05/1384388.html#1482572 在.Net Framewo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 关于GZipStream压缩与解压缩数据丢失问题
举报原因:
原因补充:

(最多只允许输入30个字)