C# 关于GZipStream压缩与解压缩数据丢失问题
来源:互联网 发布:nginx 配置全局变量 编辑:程序博客网 时间:2024/05/16 14:24
网上有很多关于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流释放之后去承载对象中读取数据或判断数据大小。这样取得的结果才是真实的。
0 0
- C# 关于GZipStream压缩与解压缩数据丢失问题
- C# GZipStream压缩与解压缩(针对文件)
- C#压缩与解压缩流类 GZipStream 的使用
- 在C#中用GZipStream压缩与解压数据
- 在C#中用GZipStream压缩与解压数据
- 【C#笔记】BZip2OutputStream和GZipStream压缩问题
- C# GZipStream 压缩 解压
- GzipStream流读写压缩数据!
- C#压缩与解压缩文件
- c#字符串压缩与解压缩
- C# Deflate 压缩与解压缩
- C#实现压缩与解压缩
- C# 文件压缩与解压缩
- 关于java中压缩与解压缩文件的问题
- c# 使用GZipStream压缩和解压流
- 用DeflateStream和GZipStream压缩数据
- GZipStream实现压缩以及出现的问题
- GZipStream实现压缩以及出现的问题
- XXX.equals(null)和XXX==null
- oracle数据获取当前自然周,当前周的起始和结束时间
- JQuery UI - resizable
- SPI、UART、I2C三种串行总线简介
- javascript中如何判断一个新创建对象是无属性的空对象?
- C# 关于GZipStream压缩与解压缩数据丢失问题
- Apache Stratos探究: Apache Stratos的Mock IaaS模块
- 配置开发支持高并发TCP连接的Linux应用程序全攻略
- 网上常用免费的webservice
- Linux阵列 RAID详解
- OC-retain,copy,assign及autorelease
- cocos2d-x v3.9 与MoveBy和MoveTo之间的对话
- actionForm详解
- 关于iOS 中retainCount=-1和一长串数字疑解