C#实现GZip压缩和解压缩入门实例

时间:2021-05-29 08:20:45 

主要是因为GZipStream的构造函数中第一个需要传入一个Stream,第二个是指定操作方式:压缩还是解压缩。

当时的疑问点主要有:

1.我传入的Stream是包含未压缩数据的Stream吗?
2.我解压时是从一个压缩流中读取数据后再用GZipStream解压吗?

出现以上两点疑问,完全是我将GZipStream的用法理解反了。

其实GZipStream里面存的是已经压缩过的数据流,传入的Stream是作为基础Stream传入,如果要压缩,那你就可以传一个空的Stream进去,如果要解压,就将包含压缩数据的Stream传进去。

而GZipStream的读和写分别对应的是解压和压缩两个操作,知道了这些,使用起来就简单了。

写入的数据会被压缩后写入到传入的Stream中,读取的数据也是解压后的数据,可以直接写入到一个新的流中。

byte[] cbytes = null;
//压缩
            using (MemoryStream cms = new MemoryStream())
            {
                using (System.IO.Compression.GZipStream gzip = new System.IO.Compression.GZipStream(cms,System.IO.Compression.CompressionMode.Compress))
                {
                    //将数据写入基础流,同时会被压缩
                    byte[] bytes = Encoding.UTF8.GetBytes("解压缩测试");
                    gzip.Write(bytes, 0, bytes.Length);
                }
                cbytes = cms.ToArray();
            }
//解压
            using (MemoryStream dms = new MemoryStream())
            {
                using (MemoryStream cms = new MemoryStream(cbytes))
                {
                    using (System.IO.Compression.GZipStream gzip = new System.IO.Compression.GZipStream(cms, System.IO.Compression.CompressionMode.Decompress))
                    {
                        byte[] bytes = new byte[1024];
                        int len = 0;
                        //读取压缩流,同时会被解压
                        while ((len = gzip.Read(bytes, 0, bytes.Length)) > 0)
                        {
                            dms.Write(bytes, 0, len);
                        }
                    }
                }
                Console.WriteLine(Encoding.UTF8.GetString(dms.ToArray()));
            }

同时 在压缩时传入的流可以是非空流,你可以在写入其他数据后再写入压缩数据,不会影响最后的结果。

如果你在解压时遇到“幻数头不正确”的提示,是因为你要解压的数据不是用GZip压缩的。

标签:C#,GZip,压缩,解压缩
0
投稿

猜你喜欢

  • c#中使用BackgroundWorker的实现

    2023-05-04 08:51:01
  • 聊一聊jdk1.8中的ArrayList 底层数组是如何扩容的

    2023-11-16 08:55:50
  • Android新闻广告条滚动效果

    2023-05-13 10:30:37
  • Java中静态代码块、构造代码块、构造函数和普通代码块的区别

    2023-11-25 10:09:06
  • android编程实现sd卡读取数据库的方法

    2021-10-03 12:26:31
  • Java String类简单用法实战示例【字符串输出、比较】

    2021-09-22 11:59:51
  • java中如何截取字符串最后一位

    2023-11-27 00:51:16
  • Mybatisplus主键生成策略算法解析

    2022-06-22 20:49:23
  • Java的后台文件夹下文件的遍历完整代码

    2023-09-18 12:32:19
  • SpringBoot整合ES解析搜索返回字段问题

    2023-01-26 21:39:53
  • Java编程之内置观察者模式实例详解

    2021-07-02 20:43:27
  • SpringBoot过滤器与拦截 器深入分析实现方法

    2023-11-28 23:04:15
  • 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic

    2022-03-26 18:43:02
  • Android通过SOCKET下载文件的方法

    2023-08-27 01:11:48
  • C# 生成随机数的代码

    2021-06-16 06:05:43
  • Android zip文件下载和解压实例

    2023-12-17 01:11:17
  • Android拍摄照片后返回缩略图的方法

    2022-11-17 14:44:58
  • 解决JTable排序问题的方法详解

    2023-02-07 08:53:42
  • Android布局之GridLayout网格布局

    2022-04-24 22:49:46
  • 关于java关键字this和super的区别和理解

    2022-08-01 14:33:09
  • asp之家 软件编程 m.aspxhome.com