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流释放之后去承载对象中读取数据或判断数据大小。这样取得的结果才是真实的。



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

转自:http://www.cnblogs.com/AndyHuang/archive/2009/02/05/1384388.html#1482572 在.Net Framewo...
  • yu12345678900
  • yu12345678900
  • 2015年10月12日 15:56
  • 2810

关于几种语言(c#,php,python,javascript)字符串的gzip压缩与解压的整理

背景介绍 因为一直在处理restful API,给移动端提供的数据需要考虑流量问题,优先考虑就是压缩现有的字符串,然后再考虑业务逻辑方面的减少流量。鉴于找这些资料也花了不少时间,所以整理了这篇文...
  • a2241076850
  • a2241076850
  • 2017年01月18日 12:33
  • 661

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

关于Java的GZIP压缩与.net C#的GZIP压缩的差异
  • sunny518
  • sunny518
  • 2016年12月29日 10:04
  • 1350

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

using System;   using System.Collections.Generic;   using System.Linq;   using System.Text;   us...
  • jimmy668
  • jimmy668
  • 2015年01月19日 13:49
  • 370

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

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

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

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

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

///         /// GZip解压函数         ///         ///         ///         public byte[] GZipDeco...
  • lbuskeep
  • lbuskeep
  • 2012年01月28日 02:34
  • 3499

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

下面是写的一个对字符串GZip压缩和解压帮助类,把全部代码贴出来: using System; using System.Collections.Generic; using System.Linq...
  • jingdian14
  • jingdian14
  • 2012年10月09日 09:16
  • 12541

c# 下怎么使用zlib/gzip压缩和解压缩?(GALGAME和Flash使用的压缩格式)

c# 下怎么使用zlib?   zlib是开源的压缩格式  源代码和DLL可以去http://www.zlib.net/    bzip2是建立在libbzip2   破解GALGAME时候很多人发现...
  • luozhuang
  • luozhuang
  • 2008年11月30日 22:31
  • 7184

C#压缩与解压缩流类 GZipStream 的使用

C#压缩与解压缩流类 GZipStream 的使用   在使用 GZipStream 进行压缩的时候, 在最后必须调用 Close()方法, 否则会发现解压缩后少一个字节, 当压缩的...
  • killcwd
  • killcwd
  • 2014年09月16日 10:46
  • 2140
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 关于GZipStream压缩与解压缩数据丢失问题
举报原因:
原因补充:

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