码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-15 09:16:53      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

原文:基于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

现贴源码如下:


  1技术分享using System;
  2技术分享using System.Collections.Generic;
  3技术分享using System.Text;
  4技术分享using System.Xml;
  5技术分享using System.Data;
  6技术分享using System.IO;
  7技术分享using System.Runtime.Serialization.Formatters.Binary;
  8技术分享using ComponentAce.Compression.Libs.zlib;
  9技术分享
 10技术分享namespace 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技术分享

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

标签:

原文地址:http://www.cnblogs.com/lonelyxmas/p/4647296.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!