原文:基于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. mysqlcluster笔记

    1.config的datamemory和indexmemory规定的内存占有量会在ndb启动时直接占用掉,所以在计算内存时,这两个加起来要小于ndb的内存,这两个还只是数据和索引的内存,查询或者插入时 ...

  2. Ext JS学习第十六天 事件机制event(一)

    此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件,相信你一定不陌生, 基本事件是什么?就类似于click.keypress.focus. ...

  3. BZOJ 1627: [Usaco2007 Dec]穿越泥地( BFS )

    BFS... --------------------------------------------------------------------------------------- #incl ...

  4. 个人自建网店(WordPress WooCommerce on SAE)集成支付宝支付

    插件: Alipay For WooCommerce 到支付宝账户的商家服务提出申请: https://b.alipay.com/order/serviceIndex.htm 在"在线签约- ...

  5. Qt SQL Programming 部分翻译

    简介:      Qt SQL 是 Qt 的重要模块之一,为了方便,Qt 对 SQL 进行了一系列的封装,并将 SQL API 分为如下三层:      (1)驱动层      (2)SQL API ...

  6. Qt 技巧: 解决未解析的SSL问题

    因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com/product ...

  7. Linux 中将用户添加到组的指令

    在 Linux 操作系统下,如何添加一个新用户到一个特定的组中?如何同时将用户添加到多个组中?又如何将一个已存在的用户移动到某个组或者给他增加一个组?对于不常用 Linux 的人来讲,记忆 Linux ...

  8. Lync 2010升级到Lync 2013POC计划-过程!

    最近在协助一家客户做升级项目调研,目前处在POC过程中,根据他们的需求我们将整个POC过程用Project 进行了下整理,了解整个项目中可能存在的风险和相应的计划过程,根据相应的计划我们能够将相应过程 ...

  9. javascript特效:会随着鼠标而动的眼睛

    这个特效非常简单,其中眼球和眼珠都是特定的图片.只要掌握好距离坐标就没问题.我就直接贴代码,有兴趣的朋友可以自己复制下来运行一下,下面的眼睛图像就是我的文件用到的图像,比较难看..我就把我的代码贴出来 ...

  10. 在Update Panel 控件里面添加 File Upload 控件 上传文件

    Detail Information:http://www.codeproject.com/Articles/482800/FileplusUploadplusinplusUpdateplusPane ...