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

ZLIB算法学习 我们的游戏资源数据、例如图片、声音、脚本等,都是使用gzip压缩的。之前做BREW的时候,大部分手机支持BREW的ZIP解压接口,有的不支持,只好在网上找了一份解压的代码。找的代码好像在解析压缩数据头部信息时,有点bug。另外在一些超低端机型上,解压过程中会死机,怀疑是解压需要的内存过大的原因。因为不熟悉gzip压缩的原理,当时胡乱改了改,有些问题也不了了之了。   现在转做智能平台,看 阅读详情

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;
            }
        }

    }
}

C++ 使用ZLIB库中的MiniZip实现目录压缩与解压 阅读详情

相关推荐

zlib、gzip与ZIP:从DEFLATE算法压缩格式的全面解析

数据压缩是计算机科学中用于减少数据存储空间和网络传输量的基础技术,其核心原理在于通过算法消除数据中的冗余信息。DEFLATE算法作为现代无损压缩的基石,结合了LZ77字典编码与霍夫曼编码,在压缩率与速度间取得了优异平衡。该算法的标准实现——zlib库,为上层应用提供了高效的压缩/解压能力,成为众多软件项目的关键依赖。在工程实践中,基于DEFLATE的gzip格式凭借其式特性和轻量级头部,成为HTTP内容压缩和日志归档的事实标准,能显著提升网络传输效率。而ZIP格式则在此基础上扩展为支持多文件归档的容器格式

weixin_30673611的博客 353

zlib zlib 压缩算法示例

zlib 压缩算法示例zlib 压缩算法示例zlib 压缩算法示例

C#:实现解压缩字节数组算法

在C#中,我们可以使用System.IO.Compression命名空间提供的类来解压缩字节数组。请注意,上述示例仅演示了使用Deflate算法进行解压缩的过程。对于这些格式,你可以使用C#中提供的相应的类来进行解压缩操作。在C#中,我们可以使用各种算法对字节数组进行解压缩。在本文中,我们将介绍如何使用C#实现解压缩字节数组的算法。方法,用于生成一个经过Deflate算法压缩的字节数组。该方法接受一个压缩的字节数组作为输入,并返回解压缩后的字节数组。最后,我们将解压缩后的字节数组转换为字符串,并进行展示。

PixelProX的博客 505

ZLIB应用实例ZLIB应用实例

ZLIB应用实例ZLIB应用实例ZLIB应用实例ZLIB应用实例ZLIB应用实例ZLIB应用实例ZLIB应用实例

C# Gzip压缩byte[](非重写算法实现)

C#通过Gzip压缩byte[] 直接上代码 //压缩 public static byte[] GZipBytes( byte[] data) { using (var ms=new MemoryStream()) { using (var gzipstream=new GZipStream(ms,CompressionMode.Compress)) { gzipstre...

clowner的博客 1135

C#WebAPI获取腾讯云签名及临时签名.rar

解决WebAPI腾讯云临时签名获取不到的问题GetFederationTokenResponse resp = client.GetFederationToken(req). ConfigureAwait(false).GetAwaiter().GetResult();

ZLIBdll+Demo源码

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

c# 自用微软库压缩 文件或者byte[](GZIP)

系统自用 亲测 byte[]数组压缩 从500k压缩到40k的样子。。

zlib开源压缩解压库源码深度解析与实战

zlib由Jean-loup Gailly和Mark Adler于1995年发布,旨在提供一个稳定、免费且跨平台的DEFLATE压缩算法实现。其设计强调简洁性与可移植性,采用C语言编写,接口简单清晰,仅需compress()和等少数函数即可完成核心功能。该代码展示了zlib最基础的压缩调用,体现了其“开箱即用”的设计理念。zlib 以两个字节的魔数开头:- 第一字节:0x78(代表版本)- 第二字节:压缩方法与窗口大小标志,常用0x9C。

weixin_36059856的博客 1452

深入掌握ZLIB算法:源代码分析与实战应用

本文还有配套的精品资源,点击获取 简介:ZLIB算法,作为广泛使用的压缩库,支持多种操作系统和平台。它基于DEFLATE算法,结合了LZ77压缩和霍夫曼编码,实现了高效的压缩与解压。源代码由C语言编写,提供了良好的可移植性和易于理解的API接口。本源代码包包含VC++工程配置,便于在Visual C++环境下编译调试。开发者可以通过ZLIB实现数据压缩、解压缩以及处理特定文...

weixin_32673065的博客 2181

掌握数据压缩与图像处理:zlib和libpng源码深度解析

在当今的数字时代,数据压缩技术是不可或缺的。zlib作为一款广泛使用的开源压缩库,它实现了高效且可靠的压缩和解压缩功能,为各类软件应用提供了支持。本章将对zlib库的背景、特点及其在数据压缩中的应用进行全面介绍。zlib是一个广泛使用的数据压缩库,由Jean-loup Gailly和Mark Adler共同开发,并在zlib许可证下开源发布。它被设计用来简化数据压缩和解压缩的过程,提供了一种简单的API接口供开发者使用。

weixin_42596246的博客 1166

字符串压缩,先zlib再base64转码示例(以Delphi为例)

1. 简介:这是常用的网络通信的手段,原因是: zlib 压缩可以将字符串体积明显缩小(只有较长才能体现出来),而base64可以将刚刚压缩的二进制码变成可见字符,便于在语言中进行传递及网络通信。2. 关于zlib压缩算法的使用:在linux 用C语言开发一般用zlib 库在Delphi5上 可以用zlibEx version 1.2.3 july 19, 2007 ? 156 kb (因为更新的

小桥加加的IT博客 3858

《VC++使用zlib压缩及解压数据,使用base64编码及解码数据(附源码)》的详细实现

VC++使用zlib压缩及解压数据,使用base64编码及解码数据》的详细实现,基于Windows平台的VC++环境,使用 zlib 库进行数据压缩和解压缩,并实现 Base64 编码和解码功能。本文提供功能介绍、实现步骤、完整源码、经典案例分析、资料扩展以及注意事项,结合您之前的VC++开发背景(如时间函数、异常捕获、网卡信息等),确保代码健壮、易于集成,并以中文详细解释,适合中文开发环境。输入示例:"Hello, World!将二进制数据编码为Base64字符串(A-Z、a-z、0-9、+、/)。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 1055
上一篇: Jsonp 跨域的原理以及Jquery的解决方案
下一篇: C#操作RTF文档
sowhat430
博客等级 码龄18年 1粉丝 1原创
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值