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. MVC中使用jquery的浏览器缓存问题

    jquery在浏览器ajax调用的时候,对缓存提供了很好的支持,POST方式不能被缓存,使用POST的原因,明确了数据不能被缓存,或者避免JSON攻击(JSON返回数据的时候可以被入侵) jquery ...

  2. 学习笔记_Java_day12_Cookie

    Cookie 1 Cookie概述 1.1 什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie就是一个键和一个值构成的 ...

  3. 动态加载js、css 代码

    一.原生js: /** * 加载js和css文件 * @param jsonData.path 前缀路径 * @param jsonData.url 需要加载的js路径或css路径 * @param ...

  4. Library string Type

    The string type supports variable-length character strings.The library takes cares of managing memor ...

  5. HTTP_USER_AGENT

    <!DOCTYPE html><html><head><meta charset="UTF-8" /><title>We ...

  6. Java基础巩固--正则表达式

    本篇文章是学习尚学堂的关于正则表达式的视频教程时,所做的笔记.供广大编程爱好者学习之用,也留给日后自己复习使用! 1.为什么要有正则表达式? 正则表达式可以方便的对数据进行匹配,可以进行更加复杂的字符 ...

  7. Libnids---编写网络应用程序的利器

    一.前言 Libnids是一个用于网络入侵检测开发的专业编程接口,它使用Libpcap进行数据包的捕获.同时,Libnids提供了TCP/IP数据流重组功能,因此省去了应用层自己考虑数据分片.重传等情 ...

  8. Licode Install CentOS 7.0

    mysqldump --add-drop-table -uroot -p123456 jit >/extra_disk/jit.sql sudo npm install -g node-gyp ...

  9. SQL Trigger(触发器)

    1.触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程. 2.触发器一般用在check约束更加复杂的约束上面. 3.触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作. 4.upd ...

  10. js 中对象属性特性2

    对象的存储描述: get   和   set 方法 <script> var obj ={ get age(){ return 22 }, set age(value){ console. ...