基于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提供默认的二进 ...
随机推荐
- Android GPS应用:动态获取位置信息
在上文中,介绍了GPS概念及Android开发GPS应用涉及到的常用类和方法.在本文中,开发一个小应用,实时获取定位信息,包括用户所在的纬度.经度.高度.方向.移动速度等.代码如下: Activity ...
- C#_会员管理系统:开发七(用户分类)
登录界面(VIPLogin.cs)详细代码: using System; using System.Collections.Generic; using System.ComponentModel; ...
- 遇见Lambda
转自:http://www.cnblogs.com/allenlooplee/archive/2012/07/03/2574119.html 在学习generate时候发现C++中的匿名函数,上面博文 ...
- Arrays类学习笔记
Arrays.asList(arr); 该方法可以把数组变成List集合. String[] arr = {"abc","cc"}; List<Strin ...
- Collection类学习笔记
binarySearch原理: public static index halfSearch(List<String> list, String key) { int max,min,mi ...
- Nginx中location配置[转]
关于一些对location认识的误区 1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我 ...
- YII2 使用js
1.在 /backend/assets/ 中新建一个文件 CollectionAsset.php <?php /** * @link http://www.yiiframework.com/ * ...
- Python之路:迭代器和yield生成器
一.迭代器 对于Python 列表的 for 循环,他的内部原理:查看下一个元素是否存在,如果存在,则取出,如果不存在,则报异常 StopIteration.(python内部对异常已处理) 使用迭代 ...
- javascript 检测密码强度 美化版
模仿美团的美化 <!DOCTYPE> <head runat="server"> <title></title> <link ...
- Mac上使用Visual Studio Code开发/调试.NET Core代码
Mac上使用Visual Studio Code开发/调试.NET Core代码 .Net Core 1.0终于发布了,Core的一大卖点就是跨平台.这个跨平台不只是跨平台运行,而且可以跨平台开发.今 ...