1.GZipStream 类

此类在 .NET Framework 2.0 版中是新增的。

提供用于压缩和解压缩流的方法和属性

2.压缩byte[]

  1. /// <summary>
  2. /// 压缩数据
  3. /// </summary>
  4. /// <param name="data"></param>
  5. /// <returns></returns>
  6. public byte[] Compress(byte[] data)
  7. {
  8. MemoryStream ms = new MemoryStream();
  9. GZipStream zipStream = new GZipStream(ms, CompressionMode.Compress);
  10. zipStream.Write(data, 0, data.Length);//将数据压缩并写到基础流中
  11. zipStream.Close();
  12. return ms.ToArray();
  13. }

3.解压byte[]

  1. /// 解压数据
  2. /// </summary>
  3. /// <param name="data"></param>
  4. /// <returns></returns>
  5. public byte[] Decompress(byte[] data)
  6. {
  7. MemoryStream srcMs = new MemoryStream(data);
  8. GZipStream zipStream = new GZipStream(srcMs, CompressionMode.Decompress);
  9. MemoryStream ms = new MemoryStream();
  10. byte[] bytes = new byte[40960];
  11. int n;
  12. while ((n = zipStream.Read(bytes, 0, bytes.Length)) > 0)
  13. {
  14. ms.Write(bytes, 0, n);
  15. }
  16. zipStream.Close();
  17. return ms.ToArray();
  18. }

4.压缩byte[]数据,存放到文件中

  1. /// <summary>
  2. /// 将指定的字节数组压缩,并写入到目标文件
  3. /// </summary>
  4. /// <param name="srcBuffer">指定的源字节数组</param>
  5. /// <param name="destFile">指定的目标文件</param>
  6. public static void CompressData(byte[] srcBuffer, string destFile)
  7. {
  8. FileStream destStream = null;
  9. GZipStream compressedStream = null;
  10. try
  11. {
  12. //打开文件流
  13. destStream = new FileStream(destFile, FileMode.OpenOrCreate, FileAccess.Write);
  14. //指定压缩的目的流(这里是文件流)
  15. compressedStream = new GZipStream(destStream, CompressionMode.Compress, true);
  16. //往目的流中写数据,而流将数据写到指定的文件
  17. compressedStream.Write(srcBuffer, 0, srcBuffer.Length);
  18. }
  19. catch (Exception ex)
  20. {
  21. throw new Exception(String.Format("压缩数据写入文件{0}时发生错误", destFile), ex);
  22. }
  23. finally
  24. {
  25. // Make sure we allways close all streams
  26. if (null != compressedStream)
  27. {
  28. compressedStream.Close();
  29. compressedStream.Dispose();
  30. }
  31. if (null != destStream)
  32. destStream.Close();
  33. }
  34. }

5.解压文件,得到byte[]数据

  1. /// <summary>
  2. /// 将指定的文件解压,返回解压后的数据
  3. /// </summary>
  4. /// <param name="srcFile">指定的源文件</param>
  5. /// <returns>解压后得到的数据</returns>
  6. public static byte[] DecompressData(string srcFile)
  7. {
  8. if (false == File.Exists(srcFile))
  9. throw new FileNotFoundException(String.Format("找不到指定的文件{0}", srcFile));
  10. FileStream sourceStream = null;
  11. GZipStream decompressedStream = null;
  12. byte[] quartetBuffer = null;
  13. try
  14. {
  15. sourceStream = new FileStream(srcFile, FileMode.Open, FileAccess.Read, FileShare.Read);
  16. decompressedStream = new GZipStream(sourceStream, CompressionMode.Decompress, true);
  17. // Read the footer to determine the length of the destiantion file
  18. //GZIP文件格式说明:
  19. //10字节的头,包含幻数、版本号以及时间戳
  20. //可选的扩展头,如原文件名
  21. //文件体,包括DEFLATE压缩的数据
  22. //8字节的尾注,包括CRC-32校验和以及未压缩的原始数据长度(4字节) 文件大小不超过4G
  23. //为Data指定byte的长度,故意开大byte数据的范围
  24. //读取未压缩的原始数据长度
  25. quartetBuffer = new byte[4];
  26. long position = sourceStream.Length - 4;
  27. sourceStream.Position = position;
  28. sourceStream.Read(quartetBuffer, 0, 4);
  29. int checkLength = BitConverter.ToInt32(quartetBuffer, 0);
  30. byte[] data;
  31. if (checkLength <= sourceStream.Length)
  32. {
  33. data = new byte[Int16.MaxValue];
  34. }
  35. else
  36. {
  37. data = new byte[checkLength + 100];
  38. }
  39. //每100byte从解压流中读出数据,并将读出的数据Copy到Data byte[]中,这样就完成了对数据的解压
  40. byte[] buffer = new byte[100];
  41. sourceStream.Position = 0;
  42. int offset = 0;
  43. int total = 0;
  44. while (true)
  45. {
  46. int bytesRead = decompressedStream.Read(buffer, 0, 100);
  47. if (bytesRead == 0)
  48. break;
  49. buffer.CopyTo(data, offset);
  50. offset += bytesRead;
  51. total += bytesRead;
  52. }
  53. //剔除多余的byte
  54. byte[] actualdata = new byte[total];
  55. for (int i = 0; i < total; i++)
  56. actualdata[i] = data[i];
  57. return actualdata;
  58. }
  59. catch (Exception ex)
  60. {
  61. throw new Exception(String.Format("从文件{0}解压数据时发生错误", srcFile), ex);
  62. }
  63. finally
  64. {
  65. if (sourceStream != null)
  66. sourceStream.Close();
  67. if (decompressedStream != null)
  68. decompressedStream.Close();
  69. }
  70. }

6.小结

压缩,解压都用GZipStream,操作的对象时普通流MemoryStream,不同的是:

压缩是将btye[]型的数据写入GZipStream中,而解压的时候是将GzipStream中的数据写入到byte[]中,并将读出的数据写入到MemoryStream后一次性输出

压缩到文件与压缩成byte[]不同的是压缩到文件利用到了FileStream将流写到文件,解压Gzip文件,需要根据文件的规则进行:后4位记录未压缩前的长度,根据该长度可以将解压出来的文件存放到稍大的byte[]中

.net 利用 GZipStream 压缩和解压缩的更多相关文章

  1. 利用ICSharpCode进行压缩和解压缩

    说说我利用ICSharpCode进行压缩和解压缩的一些自己的一下实践过程 1:组件下载地址 参考文章:C#使用ICSharpCode.SharpZipLib.dll压缩文件夹和文件 2: 文件类 // ...

  2. C# 利用ICSharpCode.SharpZipLib.dll 实现压缩和解压缩文件

    我们 开发时经常会遇到需要压缩文件的需求,利用C#的开源组件ICSharpCode.SharpZipLib, 就可以很容易的实现压缩和解压缩功能. 压缩文件: /// <summary> ...

  3. 在C#中利用SharpZipLib进行文件的压缩和解压缩收藏

    我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net(http://www.icsharpcode.net/OpenSource/SharpZipL ...

  4. 利用SharpZipLib进行字符串的压缩和解压缩

    http://www.izhangheng.com/sharpziplib-string-compression-decompression/ 今天搞了一晚上压缩和解压缩问题,java压缩的字符串,用 ...

  5. C#利用SharpZipLib进行文件的压缩和解压缩

    我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手.只好耐下心来, ...

  6. C#- 压缩和解压缩的研究 .

    用了第二种方法,感觉很不错,其他都没用过了.摘录下来,做一个备忘. 最近在网上查了一下在.net中进行压缩和解压缩的方法,方法有很多,我找到了以下几种: 1.利用.net自带的压缩和解压缩方法GZip ...

  7. .net中压缩和解压缩的处理

    最近在网上查了一下在.net中进行压缩和解压缩的方法,方法有很多,我找到了以下几种: 1.利用.net自带的压缩和解压缩方法GZip 参考代码如下: //======================= ...

  8. 关于webservice大数据量传输时的压缩和解压缩

    当访问WebSerivice时,如果数据量很大,传输数据时就会很慢.为了提高速度,我们就会想到对数据进行压缩.首先我们来分析一下. 当在webserice中传输数据时,一般都采用Dataset进行数据 ...

  9. iOS中使用ZipArchive压缩和解压缩文件-备

    为什么我需要解压缩文件 有许多原因能解释为什么我要在工程中使用压缩和解压缩功能,下面是几个常见的原因: 苹果App Store的50M下载限制 苹 果公司出于流量的考虑,规定在非WIFI环境下,限制用 ...

随机推荐

  1. android线程池ThreadPoolExecutor的理解

    android线程池ThreadPoolExecutor的理解 线程池 我自己理解看来.线程池顾名思义就是一个容器的意思,容纳的就是ThreadorRunable, 注意:每一个线程都是需要CPU分配 ...

  2. js页面之间函数调用

    1.在父级页面调用子级页面的函数 当前页面(default.aspx)通过iframe嵌套index.aspx页面,在当前页面调用index.aspx里面的js函数,如下: myFrame.windo ...

  3. javascript——四种函数调用形式

    此文的目的是分析函数的四种调用形式,弄清楚函数中this的意义,明确构造函对象的过程,学会使用上下文调用函数. 在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而 ...

  4. ZEngine游戏框架需求稿

    早在2013就开始接触cocos2dx游戏框架,觉得的使用框架对于游戏开发者来说有些不方便.我便想在cocos2dx的框架基础之上实现ZEngine库,方便开发者编辑动画,以及着重于对游戏逻辑的处理. ...

  5. jQuery EasyUI tree中state属性慎用

    EasyUI 1.4.4 tree控件中,如果是叶子节点,切忌把state设置为closed,否则该节点会加载整个tree,形成死循环 例如: json入下: [ { "checked&qu ...

  6. 在 lamp(centos)下配置二级 域名 、虚拟主机

    1.你得拥有一个泛域名解析的顶级域名,有一个独立的IP: 2.解析二级域名,如在万网中心里,记录类型为A, 主机记录即为要配的二级域名(如:增加两个:bbs.mydomain.com 和 www.my ...

  7. dom例子

    //凡是html标签中的属性和值是一样的,那么在js中用true或者false 1,阅读协议倒计时 <input type="button" name="name& ...

  8. C#实现记事本查找功能

    private void button1_Click(object sender, EventArgs e) { if (!(String.IsNullOrEmpty(this.textBox1.Te ...

  9. 『奇葩问题集锦』function * (next){ 执行报错 SyntaxError: Unexpected token *

    这是因为  app.use(function * (){ 语句中有一个 * ,这种方式被称为generator functions ,一般写作function *(){...} 的形式,在此类func ...

  10. Expat Parser解析xml文件

    Expat 解析器是基于事件的解析器. 基于事件的解析器集中在 XML 文档的内容,而不是它们的结构.正因为如此,基于事件的解析器能够比基于树的解析器更快地访问数据. 请看下面的 XML 片段: &l ...