原文:基于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. c 判断水仙花数,质数(素数)

    #include<stdio.h> #include<stdbool.h> //水仙花数--各位立方和等于本身 void sXh() { int x,y,z; printf(& ...

  2. javaweb学习路之四--cxf发布Webservice

    背景:maven构建的springMvc+mybatis框架 源码--->https://github.com/Zering/MyWeb 步骤:(本步骤是自己在实际探索过程中的步骤,我的思路是先 ...

  3. java之路径

    在学习java的过程中经常遇见关于路径的问题:到底是使用绝对路径还是相对路径? 个人推荐使用相对路径,如果是使用绝对路径,到后期项目发布的时候会出现许多问题. 那么相对路径怎么用来: 一. Syste ...

  4. Longest Substring Without Repeating Characters - 哈希与双指针

    题意很简单,就是寻找一个字符串中连续的最长包含不同字母的子串. 其实用最朴素的方法,从当前字符开始寻找,找到以当前字符开头的最长子串.这个方法猛一看是个n方的算法,但是要注意到由于字符数目的限制,其实 ...

  5. [Swust OJ 794]--最近对问题(分治)

    题目链接:http://acm.swust.edu.cn/problem/794/ Time limit(ms): 1000 Memory limit(kb): 10000   Description ...

  6. JDK和JRE的差异和区别

    来源:http://docs.oracle.com/javase/7/docs/

  7. jbpmAPI-2

    2.1. Downloads 所有的版本都可以从SourceForge下载.选择您想要下载的版本,然后选择你想要工件: https://sourceforge.net/projects/jbpm/fi ...

  8. [LeetCode]题解(python):017-Letter Combinations of a Phone Number

    题目来源: https://leetcode.com/problems/letter-combinations-of-a-phone-number/ 题意分析: 这道题是输入一段数字字符digits, ...

  9. JavaEE Tutorials (5) - 运行企业bean示例

    5.1cart示例56 5.1.1业务接口57 5.1.2会话bean类57 5.1.3@Remove方法61 5.1.4辅助类61 5.1.5运行cart示例615.2一个单例会话bean示例:co ...

  10. 关于String.concat()方法和StringBuffer.append()方法的学习:方法是如何追加字符到源字符串的

    问题分析: 首先,看看两段代码的运行结果,两段代码分别是: 第一段代码,关于String.concat()方法的测试: public static void main(String[] args) { ...