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

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

现贴源码如下:

1using System;

2using System.Collections.Generic;

3using System.Text;

4using System.Xml;

5using System.Data;

6using System.IO;

7using System.Runtime.Serialization.Formatters.Binary;

8using ComponentAce.Compression.Libs.zlib;

9

10namespace 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

时间: 2024-12-07 00:11:31

基于Zlib算法的流压缩、字符串压缩源码的相关文章

基于Linux平台下网络病毒Caem.c源码及解析

Came.c型病毒在这里主要修改了用户的密码,同时对用户的终端设备进行了监视.希望与大家共同交流 转载请注明出处:http://blog.csdn.net/u010484477     O(∩_∩)O谢谢 #define HOME "/" #define TIOCSCTTY 0x540E #define TIOCGWINSZ 0x5413 #define TIOCSWINSZ 0x5414 #define ECHAR 0x1d #define PORT 39617 #define BU

Spark技术内幕:Master基于ZooKeeper的High Availability(HA)源码实现

如果Spark的部署方式选择Standalone,一个采用Master/Slaves的典型架构,那么Master是有SPOF(单点故障,Single Point of Failure).Spark可以选用ZooKeeper来实现HA. ZooKeeper提供了一个Leader Election机制,利用这个机制可以保证虽然集群存在多个Master但是只有一个是Active的,其他的都是Standby,当Active的Master出现故障时,另外的一个Standby Master会被选举出来.由于

基于Windows Socket的安全通信(C++实现,附源码)

先了解一下Socket的相关函数原型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 //加载套接字库 int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData); //释放套接字库资源 int PASCAL FAR WSACleanup(void); //创建套接字 SOCKET PASCAL FAR socket (int af,int type,int pr

【开源下载】基于winform的xml菜单编辑器(c#源码)

xml编辑器源码 最近帮朋友做了一个档案管理系统,客户端能够把文件上传到服务器,也能够从服务器下载,支持多用户.通讯框架使用的networkcomms v3框架. 这个档案管理系统中用到了树形目录,使用人员需要随时调整左侧的目录,考虑到使用数据库的比较繁琐,就想到了一个方法,即可以在客户端编辑左侧的那个目录,保存成一个xml文件.修改完成后需要的话可以把这个xml文件上传到服务器,其他人员可以从服务器加载这个xml文件.虽然简单,但也比较好的满足了朋友的需求.今天刚好有时间,把左侧目录的编辑页面

第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密

一:Spark集群开发环境准备 启动HDFS,如下图所示: 通过web端查看节点正常启动,如下图所示: 2.启动Spark集群,如下图所示: 通过web端查看集群启动正常,如下图所示: 3.启动start-history-server.sh,如下图所示: 二:HDFS的SparkStreaming案例实战(代码部分) package com.dt.spark.SparkApps.sparkstreaming; import org.apache.spark.SparkConf; import o

第85讲:基于HDFS的SparkStreaming案例实战和内幕源码解密

一:Spark集群开发环境准备 启动HDFS,如下图所示: 通过web端查看节点正常启动,如下图所示: 2.启动Spark集群,如下图所示: 通过web端查看集群启动正常,如下图所示: 3.启动start-history-server.sh,如下图所示: 二:HDFS的SparkStreaming案例实战(代码部分) package com.dt.spark.SparkApps.sparkstreaming; import org.apache.spark.SparkConf; import o

基于RYU应用开发之负载均衡(源码开放)

编者按:本文介绍的是如何在RYU上通过使用select group 来实现multipath,从而实现流量的调度,完成简单的负载均衡Demo.在OpenFlow13中有group table,可用于实现组播和冗余容灾等功能.实验中还使用了OpenvSwitch的队列queue完成了对链路带宽的保障. 要完成多径传输,那么网络拓扑必然有loop,所以首先要解决由于loop而可能产生的storm,解决方案在<基于SDN的RYU应用开发之ARP代理>文中已经提出. 网络拓扑: ""

基于Redis实现分布式锁-Redisson使用及源码分析

在分布式场景下,有很多种情况都需要实现最终一致性.在设计远程上下文的领域事件的时候,为了保证最终一致性,在通过领域事件进行通讯的方式中,可以共享存储(领域模型和消息的持久化数据源),或者做全局XA事务(两阶段提交,数据源可分开),也可以借助消息中间件(消费者处理需要能幂等).通过Observer模式来发布领域事件可以提供很好的高并发性能,并且事件存储也能追溯更小粒度的事件数据,使各个应用系统拥有更好的自治性. 本文主要探讨另外一种实现分布式最终一致性的解决方案--采用分布式锁.基于分布式锁的解决

高效频繁模式挖掘算法PrePost和FIN的C++源码

PrePost的C++源码见http://www.cis.pku.edu.cn/faculty/system/dengzhihong/Source%20Code/prepost.cpp. 算法内容参见论文:A New Algorithm for Fast Mining Frequent Itemsets Using N-Lists) 论文免费下载地址:http://info.scichina.com:8084/sciFe/EN/abstract/abstract508369.shtml  或ht