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

原文:基于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;
 26            while ((len = input.Read(buffer, 0, buffer.Length)) > 0)
 27            {
 28                output.Write(buffer, 0, 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)
100        {
101            try
102            {
103                MemoryStream stmInput = new MemoryStream(SourceByte);
104                Stream stmOutPut = ZlibCompress.CompressStream(stmInput);
105                byte[] bytOutPut = new byte[stmOutPut.Length];
106                stmOutPut.Position = 0;
107                stmOutPut.Read(bytOutPut, 0, bytOutPut.Length);
108                return bytOutPut;
109            }
110            catch
111            {
112                return null;
113            }
114        }
115
116        /**//**//**//// <summary>
117        /// 解压byte数据数据
118    /// </summary>
119        /// <param name="SourceByte">需要被解压的byte数组数据</param>
120        /// <returns></returns>
121        public static byte[] DecompressBytes(byte[] SourceByte)
122        {
123            try
124            {
125                MemoryStream stmInput = new MemoryStream(SourceByte);
126                Stream stmOutPut = ZlibCompress.DecompressStream(stmInput);
127                byte[] bytOutPut = new byte[stmOutPut.Length];
128                stmOutPut.Position = 0;
129                stmOutPut.Read(bytOutPut, 0, bytOutPut.Length);
130                return bytOutPut;
131            }
132            catch
133            {
134                return null;
135            }
136        }
137
138        /**//**//**//// <summary>
139        /// 压缩流
140    /// </summary>
141        /// <param name="SourceStream">需要被压缩的流数据</param>
142        /// <returns></returns>
143        public static Stream CompressStream(Stream SourceStream)
144        {
145            try
146            {
147                MemoryStream stmOutTemp = new MemoryStream();
148                ZOutputStream outZStream = new ZOutputStream(stmOutTemp, zlibConst.Z_DEFAULT_COMPRESSION);
149                CopyStream(SourceStream, outZStream);
150                outZStream.finish();
151                return stmOutTemp;
152            }
153            catch
154            {
155                return null;
156            }
157        }
158
159        /**//**//**//// <summary>
160        /// 解压流
161    /// </summary>
162        /// <param name="SourceStream">需要被解缩的流数据</param>
163        /// <returns></returns>
164        public static Stream DecompressStream(Stream SourceStream)
165        {
166            try
167            {
168                MemoryStream stmOutput = new MemoryStream();
169                ZOutputStream outZStream = new ZOutputStream(stmOutput);
170                CopyStream(SourceStream, outZStream);
171                outZStream.finish();
172                return stmOutput;
173            }
174            catch
175            {
176                return null;
177            }
178        }
179
180        /**//**//**//// <summary>
181        /// 压缩字符串
182    /// </summary>
183        /// <param name="SourceString">需要被压缩的字符串</param>
184        /// <returns></returns>
185        public static string CompressString(string SourceString)
186        {
187            byte[] byteSource = System.Text.Encoding.UTF8.GetBytes(SourceString);
188            byte[] byteCompress = ZlibCompress.CompressBytes(byteSource);
189            if (byteCompress != null)
190            {
191                return Convert.ToBase64String(byteCompress);
192            }
193            else
194            {
195                return null;
196            }
197        }
198
199        /**//**//**//// <summary>
200        /// 解压字符串
201    /// </summary>
202        /// <param name="SourceString">需要被解压的字符串</param>
203        /// <returns></returns>
204        public static string DecompressString(string SourceString)
205        {
206            byte[] byteSource = Convert.FromBase64String(SourceString);
207            byte[] byteDecompress = ZlibCompress.DecompressBytes(byteSource);
208            if (byteDecompress != null)
209            {
210                return System.Text.Encoding.UTF8.GetString(byteDecompress);
211            }
212            else
213            {
214                return null;
215            }
216        }
217
218    }
219}
220

时间: 2024-08-08 17:49:17

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

基于android的无线视频监控,使用源码可是在pc端显示不了

问题描述 基于android的无线视频监控,使用源码可是在pc端显示不了 http://www.cnblogs.com/feifei1010/archive/2012/08/31/2664939.html在这里可以下载到源码这个是pc端开启服务器这个是android上运行不管是我输入0.0.0.0 还是127.0.0.1 我在pc端的程序看不到视频接入 请大神给予指导 谢谢了 解决方案 http://wenku.baidu.com/link?url=QOLtRQ2FoJRl80QAKsz8OaU

c++ directx-求 基于c++的DirectX 11 3D 综合实例 源码

问题描述 求 基于c++的DirectX 11 3D 综合实例 源码 如图,包含天空盒,四种光照,线框模式开关,雾化,镜面,反射,法线映射,着色体,曲面细分. 不是全都有也可以,最起码有五个. 急求,三天内急求,急急急,谢谢了 解决方案 可以尝试和这位博主交流:http://blog.csdn.net/xoyojank/article/category/337624/2 解决方案二: http://download.csdn.net/album/detail/885 解决方案三: [Direct

基于JavaScript实现添加到购物车效果附源码下载_javascript技巧

我们有很多种方法实现将商品添加到购物车,通常的做法是点击"添加到购物车"按钮,会跳转到购物车,在购物车里可以点击"结算"按钮进行结算.而今天我给大家介绍一个更友好的解决方案. 查看演示 下载源码 默认情况下,购物车是隐藏不可见的,当用户点击添加到购物车按钮后,商品信息会添加到购物车,购物车会以按钮的形式出现在页面右下角,点击按钮则会展开购物车,显示购物车中的商品信息,同时也可以对购物车中的商品进行删除或者结算等操作.用户也可以暂时关闭购物车继续购物. HTML结构

php中解压压缩文件实例源码

做这个之前,没有接触过php压缩这一块,网上搜了一些,大多数都是php压缩类.压缩函数,少则几百行,多的就几千行代码.这对于我这种新手来说很摸不到头脑,再说我也不用这么复杂的功能.最后参考函数手册,理清楚了几个相关的函数后,就明白了怎么去整了. PHP Zip File 函数 记得要开启 zip ,把 php.ini 中的 extension=php_zip.dll 前面的分号去掉. 源码范例:  代码如下 复制代码 <?php //需开启配置 php_zip.dll //phpinfo();

基于Annotation和Java Code配置方式的源码解析

本系列文章第一部分分析了 Spring 解析 XML 配置文件中 <bean /> 元素的源码,这是 Spring 最原始的一种配置方式,同时也使 XML 中的节点具有命名空间特性.参考 Spring 相关文档,如果有如下的配置方式: <context:component-scan base-package="com.colorcc.spring.sample"/> 则可知:其一,该元素采用了"http://www.springframework.or

Spring3.2中Bean定义之基于Annotation和Java Code配置方式的源码解析

基于 Annotation 配置 Bean Definition 的源码解读 本系列文章第一部分分析了 Spring 解析 XML 配置文件中 <bean /> 元素的源码,这是 Spring 最原始的一种配置方式,同时也使 XML 中的节点具有命名空间特性.参考 Spring 相关文档,如果有如下的配置方式: <context:component-scan base-package="com.colorcc.spring.sample" /> 则可知:其一,该

基于spring+hibernate+JQuery开发之电子相册(附源码下载)_java

项目结构: 开发之电子相册(附源码下载)_java-spring hibernate源码"> 项目首页: 注册页面: 上传图片: 效果图一: 效果图二: 效果图三: ============================================================= 下面是代码部分 ============================================================= 需要用到的数据库SQL: 复制代码 代码如下: drop dat

Android编程基于Contacts读取联系人的方法(附demo源码)_Android

本文实例讲述了Android编程基于Contacts读取联系人的方法.分享给大家供大家参考,具体如下: Android Contacts简介: 这里介绍安卓通讯录数据库.包括Android使用Contacts访问SQLite的基本知识,并了解Android SQLite和Contacts的更多信息.谷歌改变了从版本1到版本2的Contacts数据库.下面加以简单介绍. Contacts 读取代码: package com.homer.phone; import java.util.ArrayLi

duilib 使用图片素材或者算法给窗体增加阴影(源码和demo)

转载请说明原出处,谢谢:http://blog.csdn.net/zhuhongshu/article/details/42580877          之前我写的程序使用阴影时,一直是使用codeproject网站上的WndShadow类,并且把它当作单独的模块来使用,后来觉得使用阴影的情况非常多,所以今天就把这个类改写了一下,让他融入到duilib,并且可以直接使用xml来描述阴影,不需要写任何c++代码.         以前的WndShadow类是用算法来计算阴影,灵活性很大,但是缺点