.net 利用 GZipStream 压缩和解压缩
1.GZipStream 类
此类在 .NET Framework 2.0 版中是新增的。
提供用于压缩和解压缩流的方法和属性
2.压缩byte[]
- /// <summary>
- /// 压缩数据
- /// </summary>
- /// <param name="data"></param>
- /// <returns></returns>
- public byte[] Compress(byte[] data)
- {
- MemoryStream ms = new MemoryStream();
- GZipStream zipStream = new GZipStream(ms, CompressionMode.Compress);
- zipStream.Write(data, 0, data.Length);//将数据压缩并写到基础流中
- zipStream.Close();
- return ms.ToArray();
- }
3.解压byte[]
- /// 解压数据
- /// </summary>
- /// <param name="data"></param>
- /// <returns></returns>
- public byte[] Decompress(byte[] data)
- {
- MemoryStream srcMs = new MemoryStream(data);
- GZipStream zipStream = new GZipStream(srcMs, CompressionMode.Decompress);
- MemoryStream ms = new MemoryStream();
- byte[] bytes = new byte[40960];
- int n;
- while ((n = zipStream.Read(bytes, 0, bytes.Length)) > 0)
- {
- ms.Write(bytes, 0, n);
- }
- zipStream.Close();
- return ms.ToArray();
- }
4.压缩byte[]数据,存放到文件中
- /// <summary>
- /// 将指定的字节数组压缩,并写入到目标文件
- /// </summary>
- /// <param name="srcBuffer">指定的源字节数组</param>
- /// <param name="destFile">指定的目标文件</param>
- public static void CompressData(byte[] srcBuffer, string destFile)
- {
- FileStream destStream = null;
- GZipStream compressedStream = null;
- try
- {
- //打开文件流
- destStream = new FileStream(destFile, FileMode.OpenOrCreate, FileAccess.Write);
- //指定压缩的目的流(这里是文件流)
- compressedStream = new GZipStream(destStream, CompressionMode.Compress, true);
- //往目的流中写数据,而流将数据写到指定的文件
- compressedStream.Write(srcBuffer, 0, srcBuffer.Length);
- }
- catch (Exception ex)
- {
- throw new Exception(String.Format("压缩数据写入文件{0}时发生错误", destFile), ex);
- }
- finally
- {
- // Make sure we allways close all streams
- if (null != compressedStream)
- {
- compressedStream.Close();
- compressedStream.Dispose();
- }
- if (null != destStream)
- destStream.Close();
- }
- }
5.解压文件,得到byte[]数据
- /// <summary>
- /// 将指定的文件解压,返回解压后的数据
- /// </summary>
- /// <param name="srcFile">指定的源文件</param>
- /// <returns>解压后得到的数据</returns>
- public static byte[] DecompressData(string srcFile)
- {
- if (false == File.Exists(srcFile))
- throw new FileNotFoundException(String.Format("找不到指定的文件{0}", srcFile));
- FileStream sourceStream = null;
- GZipStream decompressedStream = null;
- byte[] quartetBuffer = null;
- try
- {
- sourceStream = new FileStream(srcFile, FileMode.Open, FileAccess.Read, FileShare.Read);
- decompressedStream = new GZipStream(sourceStream, CompressionMode.Decompress, true);
- // Read the footer to determine the length of the destiantion file
- //GZIP文件格式说明:
- //10字节的头,包含幻数、版本号以及时间戳
- //可选的扩展头,如原文件名
- //文件体,包括DEFLATE压缩的数据
- //8字节的尾注,包括CRC-32校验和以及未压缩的原始数据长度(4字节) 文件大小不超过4G
- //为Data指定byte的长度,故意开大byte数据的范围
- //读取未压缩的原始数据长度
- quartetBuffer = new byte[4];
- long position = sourceStream.Length - 4;
- sourceStream.Position = position;
- sourceStream.Read(quartetBuffer, 0, 4);
- int checkLength = BitConverter.ToInt32(quartetBuffer, 0);
- byte[] data;
- if (checkLength <= sourceStream.Length)
- {
- data = new byte[Int16.MaxValue];
- }
- else
- {
- data = new byte[checkLength + 100];
- }
- //每100byte从解压流中读出数据,并将读出的数据Copy到Data byte[]中,这样就完成了对数据的解压
- byte[] buffer = new byte[100];
- sourceStream.Position = 0;
- int offset = 0;
- int total = 0;
- while (true)
- {
- int bytesRead = decompressedStream.Read(buffer, 0, 100);
- if (bytesRead == 0)
- break;
- buffer.CopyTo(data, offset);
- offset += bytesRead;
- total += bytesRead;
- }
- //剔除多余的byte
- byte[] actualdata = new byte[total];
- for (int i = 0; i < total; i++)
- actualdata[i] = data[i];
- return actualdata;
- }
- catch (Exception ex)
- {
- throw new Exception(String.Format("从文件{0}解压数据时发生错误", srcFile), ex);
- }
- finally
- {
- if (sourceStream != null)
- sourceStream.Close();
- if (decompressedStream != null)
- decompressedStream.Close();
- }
- }
6.小结
压缩,解压都用GZipStream,操作的对象时普通流MemoryStream,不同的是:
压缩是将btye[]型的数据写入GZipStream中,而解压的时候是将GzipStream中的数据写入到byte[]中,并将读出的数据写入到MemoryStream后一次性输出
压缩到文件与压缩成byte[]不同的是压缩到文件利用到了FileStream将流写到文件,解压Gzip文件,需要根据文件的规则进行:后4位记录未压缩前的长度,根据该长度可以将解压出来的文件存放到稍大的byte[]中
- GZipUtil.rar (1.8 KB)
.net 利用 GZipStream 压缩和解压缩的更多相关文章
- 利用ICSharpCode进行压缩和解压缩
说说我利用ICSharpCode进行压缩和解压缩的一些自己的一下实践过程 1:组件下载地址 参考文章:C#使用ICSharpCode.SharpZipLib.dll压缩文件夹和文件 2: 文件类 // ...
- C# 利用ICSharpCode.SharpZipLib.dll 实现压缩和解压缩文件
我们 开发时经常会遇到需要压缩文件的需求,利用C#的开源组件ICSharpCode.SharpZipLib, 就可以很容易的实现压缩和解压缩功能. 压缩文件: /// <summary> ...
- 在C#中利用SharpZipLib进行文件的压缩和解压缩收藏
我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net(http://www.icsharpcode.net/OpenSource/SharpZipL ...
- 利用SharpZipLib进行字符串的压缩和解压缩
http://www.izhangheng.com/sharpziplib-string-compression-decompression/ 今天搞了一晚上压缩和解压缩问题,java压缩的字符串,用 ...
- C#利用SharpZipLib进行文件的压缩和解压缩
我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手.只好耐下心来, ...
- C#- 压缩和解压缩的研究 .
用了第二种方法,感觉很不错,其他都没用过了.摘录下来,做一个备忘. 最近在网上查了一下在.net中进行压缩和解压缩的方法,方法有很多,我找到了以下几种: 1.利用.net自带的压缩和解压缩方法GZip ...
- .net中压缩和解压缩的处理
最近在网上查了一下在.net中进行压缩和解压缩的方法,方法有很多,我找到了以下几种: 1.利用.net自带的压缩和解压缩方法GZip 参考代码如下: //======================= ...
- 关于webservice大数据量传输时的压缩和解压缩
当访问WebSerivice时,如果数据量很大,传输数据时就会很慢.为了提高速度,我们就会想到对数据进行压缩.首先我们来分析一下. 当在webserice中传输数据时,一般都采用Dataset进行数据 ...
- iOS中使用ZipArchive压缩和解压缩文件-备
为什么我需要解压缩文件 有许多原因能解释为什么我要在工程中使用压缩和解压缩功能,下面是几个常见的原因: 苹果App Store的50M下载限制 苹 果公司出于流量的考虑,规定在非WIFI环境下,限制用 ...
随机推荐
- 转载:在Visual Studio 2013中管理中国特色的社会主义Windows Azure
原文链接: http://www.pstips.net/get-azurechinacloud-settings.html 谷歌被豪迈地放弃了中国市场,微软仍旧在中国市场摸爬滚打,跪着挣钱.其中私人定 ...
- 第11条:理解objc_msgSend的作用
C语言使用“静态绑定”,也就是说,在编译期就能决定运行时所应调用的函数(也就是说函数地址硬编码在指令之中). 如果是内联函数,就无法硬编码在指令之中,而是要在运行期读取出来(也就是动态绑定). 在底层 ...
- OC与Swift的区别四(条件语句)
12.条件语句的区别,此处只写区别,没有指出区别的其他方面oc与swift基本一致 12.1 oc中for if switch语句体如果只有一行代码,则{}可以省略 swift中for if swit ...
- javascript 基础1第11节
<html> <head> <title>javascript基础</title> </head> <body> 1.NaN i ...
- bzoj1231: [Usaco2008 Nov]mixup2 混乱的奶牛
思路:状压dp,设f[i][j]表示当前已经选出的牛的状态为i,最后一头选出的牛为j的方案数. 然后注意就是初值不能是f[0][i]=1,因为所有牛本来都可以第一个被选中,然而这样一定初值有些牛可能就 ...
- wamp集成环境php多版本搭建(php5.5,php5.6,php7.0.6)
首先需要搭建的版本可以在php官方(http://windows.php.net/download)下载对应的版本,X86对应的是32位操作系统,X64对应的是64位操作系统. 1:下载 ...
- uploadify 上传文件出现HTTP 404错误
今天在使用jquery.uploadify.js上传文件的时候,出现HTTP 404错误,此错误在上传较小文件时不会出现,在上传一个50M左右文件时出现此错误,经过测试和日志查看发现,根本没有进入后台 ...
- javaScript & jquery完美判断图片是否加载完毕
好久没写东西了,正好最近因为工作需要,写了一个瀑布流异步加载的程序. 今天就不谈瀑布流,来谈一下关于load的问题. ----------------------------------------- ...
- javascript进阶——测试和打包分发
建立一个面向对象的好的代码基础后,为了达到代码重用的目的,通过调试使用适当的测试用例进行测试尤为必要,之后就是打包分发的主题. 一.调试与测试 1.调试 Firebug:包含了错误控制台.调试器.DO ...
- 【python】求水仙数
for i in range(100, 1000): sum = 0 temp = i while temp: sum = sum + (temp%10) ** 3 temp //= 10 # 注意使 ...