基于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;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Data;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using ComponentAce.Compression.Libs.zlib;

namespace Test.Compress
...{
    /** <summary>
    /// Zlib压缩算法压缩应用类
  /// </summary>
    public class ZlibCompress
    ...{
        /** <summary>
        /// 拷贝复制流字节
        /// </summary>
        /// <param name="input"></param>
        /// <param name="output"></param>
        private static void CopyStream(Stream input, Stream output)
        ...{
            byte[] buffer = new byte[ZipConst.ZIP_BUFFER_SIZE];
            int len;
            while ((len = input.Read(buffer, 0, buffer.Length)) > 0)
            ...{
                output.Write(buffer, 0, len);
            }
            output.Flush();
        }

        /** <summary>
        /// 压缩文件
    /// </summary>
        /// <param name="FileName">被压缩文件名(必须输入绝对路径)</param>
        /// <param name="CompressedFileName">压缩后保存的文件名(必须输入绝对路径)</param>
        /// <returns></returns>
        public static bool CompressFile(string FileName, string CompressedFileName)
        ...{
            bool bResult = false;

            FileStream outFileStream = new FileStream(CompressedFileName, FileMode.Create);
            ZOutputStream outZStream = new ZOutputStream(outFileStream, zlibConst.Z_DEFAULT_COMPRESSION);
            FileStream inFileStream = new FileStream(FileName, FileMode.Open);
            try
            ...{
                CopyStream(inFileStream, outZStream);
                bResult = true;
            }
            catch
            ...{
                bResult = false;
            }
            finally
            ...{
                outZStream.Close();
                outFileStream.Close();
                inFileStream.Close();
            }
            return bResult;
        }

        /** <summary>
        /// 解压文件
    /// </summary>
        /// <param name="CompressedFileName">被解压文件名(必须输入绝对路径)</param>
        /// <param name="DecompressFileName">解压后保存的文件名(必须输入绝对路径)</param>
        /// <returns></returns>
        public static bool DecompressFile(string CompressedFileName, string DecompressFileName)
        ...{
            bool bResult = false;
            FileStream outFileStream = new FileStream(DecompressFileName, FileMode.Create);
            ZOutputStream outZStream = new ZOutputStream(outFileStream);
            FileStream inFileStream = new FileStream(CompressedFileName, FileMode.Open);
            try
            ...{
                CopyStream(inFileStream, outZStream);
                bResult = true;
            }
            catch
            ...{
                bResult = false;
            }
            finally
            ...{
                outZStream.Close();
                outFileStream.Close();
                inFileStream.Close();
            }
            return bResult;
        }

        /** <summary>
        /// 压缩byte数组数据
    /// </summary>
        /// <param name="SourceByte">需要被压缩的Byte数组数据</param>
        /// <returns></returns>
        public static byte[] CompressBytes(byte[] SourceByte)
        ...{
            try
            ...{
                MemoryStream stmInput = new MemoryStream(SourceByte);
                Stream stmOutPut = ZlibCompress.CompressStream(stmInput);
                byte[] bytOutPut = new byte[stmOutPut.Length];
                stmOutPut.Position = 0;
                stmOutPut.Read(bytOutPut, 0, 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];
                stmOutPut.Position = 0;
                stmOutPut.Read(bytOutPut, 0, 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;
            }
        }

    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
ZLIB.NET: README ================================================== Contents -------- Program information Company information Description Specification Other ComponentAce compression products Program information ------------------- Program Name: ZLIB.NET License Type: freeware Program Version: 1.04 Program Release Date: 03/28/2007 Program Purpose: version of ZLIB compression library for .NET framework Target Environment: Visual Studio 2003, Visual Studio 2005, Borland Developer Studio 2005, Borland Developer Studio 2006 and other Company information ------------------- Company Name: ComponentAce Contact E-mail Address: support@componentace.com Contact WWW URL: http://www.componentace.com Description ----------- 100% managed version of ZLIB compression library. Based on JZlib library (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. The zlib compression library was written by Jean-loup Gailly gzip@prep.ai.mit.edu and Mark Adler madler@alumni.caltech.edu. The primary site for the zlib compression library is http://www.zlib.org. Copyright and license --------------------- See "license.txt" file. Warranty and guarantee ---------------------- See "license.txt" file. Other ComponentAce compression products --------------------------------------- ZipForge.NET ------------ ZipForge.NET is an advanced ZIP compression library for .NET framework. ZipForge.NET features include streaming support, transaction system, ZIP encryption, repair, progress indication, Zip64 support, SFX (self-extracting) archives, unicode filenames, spanning support and much more. FlexCompress.NET ---------------- FlexCompress.NET is an advanced compression and encryption .NET component designed to provide archive functionality for your applications. This solution provides flexible compression and strong encryption algorithms that allows you to integrate archiving or backup features into your programs in a fast and easy way. FlexCompres.NET uses its
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值