原文:基于Zlib算法的流压缩、字符串压缩源码

Zlib.net官方源码demo中提供了压缩文件的源码算法。处于项目研发的需要,我需要对内存流进行压缩,由于zlib.net并无相关文字帮助只能自己看源码解决。通过对SharpZipLib的demo研究,写出了Zlib.net的流压缩算法。

中间花费了不少的时间,应为通过Stream压缩出来的数据全是空的,呵呵,主要原因就是忽略了ZOutputStream.flush()和ZOutPutStream.close()方法。大家自己看吧。关于字符串压缩,自然是把字符串塞到MemoryStream中就可以了:)

其中Zlib.net从http://www.componentace.com下载。/Files/yangyong/zlib.NET_104.rar

现贴源码如下:

  1using System;

  2using System.Collections.Generic;

  3using System.Text;

  4using System.Xml;

  5using System.Data;

  6using System.IO;

  7using System.Runtime.Serialization.Formatters.Binary;

  8using ComponentAce.Compression.Libs.zlib;

  9

 10namespace Test.Compress

 11{

 12    /**//**//**//// <summary>

 13    /// Zlib压缩算法压缩应用类

 14  /// </summary>

 15    public class ZlibCompress

 16    {

 17        /**//**//**//// <summary>

 18        /// 拷贝复制流字节

 19        /// </summary>

 20        /// <param name="input"></param>

 21        /// <param name="output"></param>

 22        private static void CopyStream(Stream input, Stream output)

 23        {

 24            byte[] buffer = new byte[ZipConst.ZIP_BUFFER_SIZE];

 25            int len;

)

 27            {

, len);

 29            }

 30            output.Flush();

 31        }

 32

 33        /**//**//**//// <summary>

 34        /// 压缩文件

 35    /// </summary>

 36        /// <param name="FileName">被压缩文件名(必须输入绝对路径)</param>

 37        /// <param name="CompressedFileName">压缩后保存的文件名(必须输入绝对路径)</param>

 38        /// <returns></returns>

 39        public static bool CompressFile(string FileName, string CompressedFileName)

 40        {

 41            bool bResult = false;

 42

 43            FileStream outFileStream = new FileStream(CompressedFileName, FileMode.Create);

 44            ZOutputStream outZStream = new ZOutputStream(outFileStream, zlibConst.Z_DEFAULT_COMPRESSION);

 45            FileStream inFileStream = new FileStream(FileName, FileMode.Open);

 46            try

 47            {

 48                CopyStream(inFileStream, outZStream);

 49                bResult = true;

 50            }

 51            catch

 52            {

 53                bResult = false;

 54            }

 55            finally

 56            {

 57                outZStream.Close();

 58                outFileStream.Close();

 59                inFileStream.Close();

 60            }

 61            return bResult;

 62        }

 63

 64        /**//**//**//// <summary>

 65        /// 解压文件

 66    /// </summary>

 67        /// <param name="CompressedFileName">被解压文件名(必须输入绝对路径)</param>

 68        /// <param name="DecompressFileName">解压后保存的文件名(必须输入绝对路径)</param>

 69        /// <returns></returns>

 70        public static bool DecompressFile(string CompressedFileName, string DecompressFileName)

 71        {

 72            bool bResult = false;

 73            FileStream outFileStream = new FileStream(DecompressFileName, FileMode.Create);

 74            ZOutputStream outZStream = new ZOutputStream(outFileStream);

 75            FileStream inFileStream = new FileStream(CompressedFileName, FileMode.Open);

 76            try

 77            {

 78                CopyStream(inFileStream, outZStream);

 79                bResult = true;

 80            }

 81            catch

 82            {

 83                bResult = false;

 84            }

 85            finally

 86            {

 87                outZStream.Close();

 88                outFileStream.Close();

 89                inFileStream.Close();

 90            }

 91            return bResult;

 92        }

 93

 94        /**//**//**//// <summary>

 95        /// 压缩byte数组数据

 96    /// </summary>

 97        /// <param name="SourceByte">需要被压缩的Byte数组数据</param>

 98        /// <returns></returns>

 99        public static byte[] CompressBytes(byte[] SourceByte)

        {

            try

            {

                MemoryStream stmInput = new MemoryStream(SourceByte);

                Stream stmOutPut = ZlibCompress.CompressStream(stmInput);

                byte[] bytOutPut = new byte[stmOutPut.Length];

;

, bytOutPut.Length);

                return bytOutPut;

            }

            catch

            {

                return null;

            }

        }



        /**//**//**//// <summary>

        /// 解压byte数据数据

    /// </summary>

        /// <param name="SourceByte">需要被解压的byte数组数据</param>

        /// <returns></returns>

        public static byte[] DecompressBytes(byte[] SourceByte)

        {

            try

            {

                MemoryStream stmInput = new MemoryStream(SourceByte);

                Stream stmOutPut = ZlibCompress.DecompressStream(stmInput);

                byte[] bytOutPut = new byte[stmOutPut.Length];

;

, bytOutPut.Length);

                return bytOutPut;

            }

            catch

            {

                return null;

            }

        }



        /**//**//**//// <summary>

        /// 压缩流

    /// </summary>

        /// <param name="SourceStream">需要被压缩的流数据</param>

        /// <returns></returns>

        public static Stream CompressStream(Stream SourceStream)

        {

            try

            {

                MemoryStream stmOutTemp = new MemoryStream();

                ZOutputStream outZStream = new ZOutputStream(stmOutTemp, zlibConst.Z_DEFAULT_COMPRESSION);

                CopyStream(SourceStream, outZStream);

                outZStream.finish();

                return stmOutTemp;

            }

            catch

            {

                return null;

            }

        }



        /**//**//**//// <summary>

        /// 解压流

    /// </summary>

        /// <param name="SourceStream">需要被解缩的流数据</param>

        /// <returns></returns>

        public static Stream DecompressStream(Stream SourceStream)

        {

            try

            {

                MemoryStream stmOutput = new MemoryStream();

                ZOutputStream outZStream = new ZOutputStream(stmOutput);

                CopyStream(SourceStream, outZStream);

                outZStream.finish();

                return stmOutput;

            }

            catch

            {

                return null;

            }

        }



        /**//**//**//// <summary>

        /// 压缩字符串

    /// </summary>

        /// <param name="SourceString">需要被压缩的字符串</param>

        /// <returns></returns>

        public static string CompressString(string SourceString)

        {

            byte[] byteSource = System.Text.Encoding.UTF8.GetBytes(SourceString);

            byte[] byteCompress = ZlibCompress.CompressBytes(byteSource);

            if (byteCompress != null)

            {

                return Convert.ToBase64String(byteCompress);

            }

            else

            {

                return null;

            }

        }



        /**//**//**//// <summary>

        /// 解压字符串

    /// </summary>

        /// <param name="SourceString">需要被解压的字符串</param>

        /// <returns></returns>

        public static string DecompressString(string SourceString)

        {

            byte[] byteSource = Convert.FromBase64String(SourceString);

            byte[] byteDecompress = ZlibCompress.DecompressBytes(byteSource);

            if (byteDecompress != null)

            {

                return System.Text.Encoding.UTF8.GetString(byteDecompress);

            }

            else

            {

                return null;

            }

        }



    }

}

基于Zlib算法的流压缩、字符串压缩源码的更多相关文章

  1. 基于HDFS的SparkStreaming案例实战和内幕源码解密

    一:Spark集群开发环境准备 启动HDFS,如下图所示: 通过web端查看节点正常启动,如下图所示: 2.启动Spark集群,如下图所示: 通过web端查看集群启动正常,如下图所示: 3.启动sta ...

  2. 光流算法:Brox光流的OpenCV源码解析

    OpenCV中DeepFlow代码其实是Brox光流,而非真正的DeepFlow光流,在将近一个月的研究.移植及优化过程中,对Brox光流有了较深刻的认识.我对OpenCV中源码进行了详细的分析,并以 ...

  3. 基于MVVM的知乎日报应用安卓源码

    使用data binding , dagger2 , retrofit2和rxjava实现的,基于MVVM的知乎日报APP运行效果: <ignore_js_op> 使用说明: 项目结构 a ...

  4. 源码来袭!!!基于jquery的ajax分页插件(demo+源码)

    前几天打开自己的博客园主页,无意间发现自己的园龄竟然有4年之久了.可是看自己的博客列表却是空空如也,其实之前也有写过,但是一直没发布(然而好像并没有什么卵用).刚开始学习编程时就接触到博客园,且在博客 ...

  5. 干货——基于Nop的精简版开发框架(附源码)

    .NET的开发人员应该都知道这个大名鼎鼎的高质量b2c开源项目-nopCommerce,基于EntityFramework和MVC开发,拥有透明且结构良好的解决方案,同时结合了开源和商业软件的最佳特性 ...

  6. 基于微软企业库的AOP组件(含源码)

    软件开发,离不开对日志的操作.日志可以帮助我们查找和检测问题,比较传统的日志是在方法执行前或后,手动调用日志代码保存.但自从AOP出现后,我们就可以避免这种繁琐但又必须要实现的方式.本文是在微软企业库 ...

  7. arcgis api 3.x for js 共享干货系列之一自写算法实现地图量算工具(附源码下载)

    0.内容概览 Geometry 地图服务方式实现地图距离以及面积的量算,简单描述 arcgis api 提供的接口类 geometryEngine 实现地图距离以及面积的量算,简单描述 自定义距离以及 ...

  8. 基于Python的datetime模块和time模块源码阅读分析

    目录 1 前言  2 datetime.pyi源码分步解析 2.1 头部定义源码分析 2.2 tzinfo类源码分析 2.3 date类源码分析 2.4 time类源码分析 2.5 timedelta ...

  9. 基于cdh5.10.x hadoop版本的apache源码编译安装spark

    参考文档:http://spark.apache.org/docs/1.6.0/building-spark.html spark安装需要选择源码编译方式进行安装部署,cdh5.10.0提供默认的二进 ...

随机推荐

  1. css中的滤镜

    前几天在做一个app应用的时候,用到了滤镜.在之前我只是知道有这么个东西,但是具体的知识点其实我是不太清楚的,所以为了让自己能深刻记忆,专门把它来记录一下.. 一.滤镜的标识符:“filter”;语法 ...

  2. .net 中文显示乱码问题(Chinese display with messy code)

    Case:同样的代码,本地开发环境(local is Chinese Simplify)可以成功运行,但是放到Windows Server 2008 R2(Local is United State) ...

  3. 解决Jedis数据读取乱码问题

    现象 同一套代码,同一个数据源,不同的操作系统,在OSX上数据提取编码正常,而Ubuntu上拉取数据乱码,数据拉取代码如下. @Override public List<String> m ...

  4. java反射机制入门02

    Field对象的机制与实现 1.Field对象概述 1)Java.lang.reflect.Field类,是用于表示类中.接口中属性对象的类. 2)可以操作类中私有,以及公有等全部属性和属性的信息. ...

  5. ansible不配ssh连接,用户密码登录

    ansible 不配ssh免密链接,直接用ssh用户密码连接,要先装sshpass. 否则会报错: sshpass安装 sshpass下载地址:http://sourceforge.net/proje ...

  6. HTML5 总结-表单-表单元素

    HTML5 表单元素 HTML5 的新的表单元素: HTML5 拥有若干涉及表单的元素和属性. 本章介绍以下新的表单元素: datalist keygen output 浏览器支持 Input typ ...

  7. QQ对话代码

    <li> <strong class="QQ">客服QQ</strong> <span> <a href="mqqw ...

  8. 使用JS进行pc端、手机端判断

     <script type="text/javascript">            (function(){                var ua = nav ...

  9. 复习知识点:XML解析数据,JOSN解析数据,GET请求数据,POST请求数据

    GDataXMLDocument-XML解析 #pragma mark - ======== Dom XML解析 - (IBAction)domParserActionXML_Document:(id ...

  10. Memcached初体验及原理解说

    1.简单介绍 Memcached 是一个 高性能的 分布式 内存对象缓存系统,用于动态Web应用降低数据库负载,提升性能. 2.试用场景 1.变化频繁,具有不稳定性的数据 (比方用户在线状态.在线人数 ...