您的位置:首页 > 编程语言 > C#

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

2015-11-18 10:39 399 查看
网上有很多关于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 压缩