当前位置: 移动技术网 > IT编程>开发语言>c# > C#实现GZip压缩和解压缩入门实例

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

2019年07月18日  | 移动技术网IT编程  | 我要评论
主要是因为gzipstream的构造函数中第一个需要传入一个stream,第二个是指定操作方式:压缩还是解压缩。 当时的疑问点主要有: 1.我传入的stream是包含未

主要是因为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压缩的。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网