基于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
现贴源码如下:
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.Compress11



{12

/**//**//**//// <summary>13
/// Zlib压缩算法压缩应用类14
/// </summary>15
public class ZlibCompress16


{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
try47


{48
CopyStream(inFileStream, outZStream);49
bResult = true;50
}51
catch52


{53
bResult = false;54
}55
finally56


{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
try77


{78
CopyStream(inFileStream, outZStream);79
bResult = true;80
}81
catch82


{83
bResult = false;84
}85
finally86


{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算法的流压缩、字符串压缩源码的更多相关文章
- 基于HDFS的SparkStreaming案例实战和内幕源码解密
一:Spark集群开发环境准备 启动HDFS,如下图所示: 通过web端查看节点正常启动,如下图所示: 2.启动Spark集群,如下图所示: 通过web端查看集群启动正常,如下图所示: 3.启动sta ...
- 光流算法:Brox光流的OpenCV源码解析
OpenCV中DeepFlow代码其实是Brox光流,而非真正的DeepFlow光流,在将近一个月的研究.移植及优化过程中,对Brox光流有了较深刻的认识.我对OpenCV中源码进行了详细的分析,并以 ...
- 基于MVVM的知乎日报应用安卓源码
使用data binding , dagger2 , retrofit2和rxjava实现的,基于MVVM的知乎日报APP运行效果: <ignore_js_op> 使用说明: 项目结构 a ...
- 源码来袭!!!基于jquery的ajax分页插件(demo+源码)
前几天打开自己的博客园主页,无意间发现自己的园龄竟然有4年之久了.可是看自己的博客列表却是空空如也,其实之前也有写过,但是一直没发布(然而好像并没有什么卵用).刚开始学习编程时就接触到博客园,且在博客 ...
- 干货——基于Nop的精简版开发框架(附源码)
.NET的开发人员应该都知道这个大名鼎鼎的高质量b2c开源项目-nopCommerce,基于EntityFramework和MVC开发,拥有透明且结构良好的解决方案,同时结合了开源和商业软件的最佳特性 ...
- 基于微软企业库的AOP组件(含源码)
软件开发,离不开对日志的操作.日志可以帮助我们查找和检测问题,比较传统的日志是在方法执行前或后,手动调用日志代码保存.但自从AOP出现后,我们就可以避免这种繁琐但又必须要实现的方式.本文是在微软企业库 ...
- arcgis api 3.x for js 共享干货系列之一自写算法实现地图量算工具(附源码下载)
0.内容概览 Geometry 地图服务方式实现地图距离以及面积的量算,简单描述 arcgis api 提供的接口类 geometryEngine 实现地图距离以及面积的量算,简单描述 自定义距离以及 ...
- 基于Python的datetime模块和time模块源码阅读分析
目录 1 前言 2 datetime.pyi源码分步解析 2.1 头部定义源码分析 2.2 tzinfo类源码分析 2.3 date类源码分析 2.4 time类源码分析 2.5 timedelta ...
- 基于cdh5.10.x hadoop版本的apache源码编译安装spark
参考文档:http://spark.apache.org/docs/1.6.0/building-spark.html spark安装需要选择源码编译方式进行安装部署,cdh5.10.0提供默认的二进 ...
随机推荐
- 浅谈web前端开发阅历
WEB前端研发工程师,在国内算是一个朝阳职业,这个领域没有学校的正轨教育,大多数人都是靠本人自学成才.本文次要引见本人从事web开发以来(从大二至今)看过的书籍和本人的成长过程,目的是给想了解Java ...
- 「OC」@property @synthesize和id
一.@property @synthesize关键字 这两个关键字是编译器特性,让Xcode可以自动生成getter和setter. (一)@property 关键字 @property 关键字可以自 ...
- BZOJ 3675: [Apio2014]序列分割( dp + 斜率优化 )
WA了一版... 切点确定的话, 顺序是不会影响结果的..所以可以dp dp(i, k) = max(dp(j, k-1) + (sumn - sumi) * (sumi - sumj)) 然后斜率优 ...
- Python之路Day18
今天主要内容:Django Form.Django Admin.Django进阶 Django Admin 自带的验证: Django Admin的定制 Django Admin 自定义actions ...
- JavaScripts+jquery
选择器 参数 element 一个用于搜索的元素.指向DOM节点的标签名. <div>div1</div> <div>div2</div> <sp ...
- MVC3 Razor @RenderSection
Mvc3的Razor视图引擎还提供了@RenderSection @RenderSection在母版页中占个位,然后让使用此母版页的子页自己去呈现他们的Section. 在母版页_Layout.csh ...
- 转:jQuery事件绑定.on()简要概述及应用
前几天在看<jquery基础教程>,看到事件委托的时候,关于live()方法讲的不是很详细,就去搜了一下关于live()和delegate()的. 然后在一处看到live()已经被移除了, ...
- 51cto培训课程
课程: 云计算: OpenStack | 虚拟化 | 云平台 | Office 365 | 云服务 | Docker | 其他 大数据: Spark | Hadoop | Storm | Hive | ...
- POJ-1003&1004
这两题比较简单,就不做分析了,描述下题目,就上代码吧. [题目描述] 1003,其实就是求这个方程的最小n:1/2 + 1/3 + 1/4 + ... + 1/(n + 1) >= c: 100 ...
- android动效开篇
大神博客:http://blog.csdn.net/tianjian4592/article/details/44155147 在现在的Android App开发中,动效越来越受到产品和设计师同学的重 ...