基于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提供默认的二进 ...
随机推荐
- WINCE平台下C#应用程序中使用看门狗
看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个大数,程序开始运行后看门狗开始倒计数.如果程序运行正常,过一段时间CPU应发出指令让 ...
- 浅谈CSS布局
在No.4中谈及了下盒子模型,引出布局模型 1.布局模型有三类: 1)流动模型 flow(默认) 2)浮动模型 float 3)层模型 layer 2.文档流 :指的是文本沿着从左到右的方向展开 ...
- 制作自己的私有库(cocopods)
1.首先你需要创建一个私有的仓库,用于存放自己的podspec相关文件,至于git服务器你可以用http://git.oschina.net/,或者自己搭建的都行.我在git服务器上创建了一个名字叫T ...
- 建立dblink,clob
建立dblink的方法, 如果有个测试库A,要访问生产库里的数据,那么可以直接在测试库A里建立一个dblink,然后数据库A就可以直接访问测试库B的数据了. -- 删除已有的dblink drop d ...
- crontab中使用mysql问题
第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4列月1-12第5列星期0-6(0表示星期天)第6列要运行的命令 , 并列 - 连续 crontab中不能执行mysql,百分之 ...
- ie条件注释还能这样写
通过条件注释给html开始标签定义不同的class, 来区分不同版本的IE,可以在样式表中避免 样式属性hack (如 _margin-top, *float:none ) 注意: IE10+不支持条 ...
- VCC、VDD、VEE、VSS的区别
电路设计以及PCB制作中,经常碰见电源符号:VCC. VDD.VEE.VSS,他们具有什么样的关系那? 一.解释 VCC:C=circuit 表示电路的意思, 即接入电路的电压 VDD:D=devic ...
- [置顶] IT屌丝的离职申请
各位好,很遗憾在如此关键的时刻和大家说告别.我为金三也付出了近一年的心血,几乎没怎么休过令人舒心的周末,熬了多少夜更不用说,如此的离开,请相信我也非常心痛. 尽管直到现在我的水 ...
- (step8.2.4)hdu 1846(Brave Game——巴什博奕)
题目大意:输入一个整数t,表示测试用例是.接着输入2个整数n,m.分别表示这堆石头中石头的个数,和每次所能取得最大的石头数.判断那一方为赢家 解题思路: 1)这是一道简单的巴什博弈: 所谓巴什博弈,是 ...
- 谷歌三大核心技术(二)Google MapReduce中文版
谷歌三大核心技术(二)Google MapReduce中文版 Google MapReduce中文版 译者: alex 摘要 MapReduce是一个编程模型,也是一个处理和生成超大数据 ...