原文:基于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. 正则RegEXp

    JavaScript RegExp 对象 RegExp 对象 RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具. 直接量语法 /pattern/attributes 创建 RegE ...

  2. Visual Studio Tip: Get Public Key Token for a Strong Named Assembly

    The first 3 parts are easy to get. I should know the name, version, and culture for the assembly sin ...

  3. 行列转换小结 Pivot ,Unpivot (转,改)

    行专列 Pivot 1)SQL 2000版本 静态 SELECT ID , SUM(CASE Code WHEN 'Item1' THEN Value END) AS Item1 , SUM(CASE ...

  4. WRTnode 的 HTTP Web PWM 调光实验(2016-05-16)

    前言 这里是节取自 物联网的任意门——WRTnode2R 评测 中的 http web PWM 调光灯实验,所以有一些前置设置如果没有描述清楚可参考该处. 正文 步骤一:编辑 html 文件放在 /w ...

  5. [Swust OJ 771]--奶牛农场(几何题,画图就好)

    题目链接:http://acm.swust.edu.cn/problem/771/    Description 将军有一个用栅栏围成的矩形农场和一只奶牛,在农场的一个角落放有一只矩形的箱子,有一天将 ...

  6. CentOS6.5安装MySQL5.7详细教程

    注:文中所写的安装过程均在CentOS6.5 x86下通过测试 主要参考博文: https://segmentfault.com/a/1190000003049498 http://www.th7.c ...

  7. [LeetCode]题解(python):008-String to Integer (atoi)

    题目来源: https://leetcode.com/problems/string-to-integer-atoi/ 题意分析: 这道题也是简单题,题目意思是要将字符串转化成int.比如‘123’转 ...

  8. 【转】NP-Hard和NP-Complete的区别

    原文来自:http://hi.baidu.com/nuclearspace/item/e0f8a1b777914974254b09f4 对 NP-Hard问题和NP-Complete问题的一个直观的理 ...

  9. javascript 关闭页面提示

    window.onbeforeunload = function (e) { e = e || window.event; // For IE and Firefox prior to version ...

  10. Sqlite出现SQL error: database disk image is malformed的处理

    SQLite有一个很严重的缺点就是不提供Repair命令.导致死亡提示database disk image is malformed它的产生有很多种可能,比如,磁盘空间不足,还有就是写入数据过程中突 ...