基于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提供默认的二进 ...
随机推荐
- mysqlcluster笔记
1.config的datamemory和indexmemory规定的内存占有量会在ndb启动时直接占用掉,所以在计算内存时,这两个加起来要小于ndb的内存,这两个还只是数据和索引的内存,查询或者插入时 ...
- Ext JS学习第十六天 事件机制event(一)
此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件,相信你一定不陌生, 基本事件是什么?就类似于click.keypress.focus. ...
- BZOJ 1627: [Usaco2007 Dec]穿越泥地( BFS )
BFS... --------------------------------------------------------------------------------------- #incl ...
- 个人自建网店(WordPress WooCommerce on SAE)集成支付宝支付
插件: Alipay For WooCommerce 到支付宝账户的商家服务提出申请: https://b.alipay.com/order/serviceIndex.htm 在"在线签约- ...
- Qt SQL Programming 部分翻译
简介: Qt SQL 是 Qt 的重要模块之一,为了方便,Qt 对 SQL 进行了一系列的封装,并将 SQL API 分为如下三层: (1)驱动层 (2)SQL API ...
- Qt 技巧: 解决未解析的SSL问题
因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com/product ...
- Linux 中将用户添加到组的指令
在 Linux 操作系统下,如何添加一个新用户到一个特定的组中?如何同时将用户添加到多个组中?又如何将一个已存在的用户移动到某个组或者给他增加一个组?对于不常用 Linux 的人来讲,记忆 Linux ...
- Lync 2010升级到Lync 2013POC计划-过程!
最近在协助一家客户做升级项目调研,目前处在POC过程中,根据他们的需求我们将整个POC过程用Project 进行了下整理,了解整个项目中可能存在的风险和相应的计划过程,根据相应的计划我们能够将相应过程 ...
- javascript特效:会随着鼠标而动的眼睛
这个特效非常简单,其中眼球和眼珠都是特定的图片.只要掌握好距离坐标就没问题.我就直接贴代码,有兴趣的朋友可以自己复制下来运行一下,下面的眼睛图像就是我的文件用到的图像,比较难看..我就把我的代码贴出来 ...
- 在Update Panel 控件里面添加 File Upload 控件 上传文件
Detail Information:http://www.codeproject.com/Articles/482800/FileplusUploadplusinplusUpdateplusPane ...