`

.net 利用 GZipStream 压缩和解压缩

    博客分类:
  • .net
 
阅读更多

 

.net 利用 GZipStream 压缩和解压缩

1.GZipStream 类

 

此类在 .NET Framework 2.0 版中是新增的。

提供用于压缩和解压缩流的方法和属性

2.压缩byte[]

        /// <summary>
        /// 压缩数据
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public byte[] Compress(byte[] data)
        {
            MemoryStream ms = new MemoryStream();
            GZipStream zipStream = new GZipStream(ms, CompressionMode.Compress);
            zipStream.Write(data, 0, data.Length);//将数据压缩并写到基础流中
            zipStream.Close();
            return ms.ToArray();
        }

3.解压byte[]

        /// 解压数据
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public byte[] Decompress(byte[] data)
        {
            MemoryStream srcMs = new MemoryStream(data);
            GZipStream zipStream = new GZipStream(srcMs, CompressionMode.Decompress);
            MemoryStream ms = new MemoryStream();
            byte[] bytes = new byte[40960];
            int n;
            while ((n = zipStream.Read(bytes, 0, bytes.Length)) > 0)
            {
                ms.Write(bytes, 0, n);
            }
            zipStream.Close();
            return ms.ToArray();
        }

4.压缩byte[]数据,存放到文件中

/// <summary>
        /// 将指定的字节数组压缩,并写入到目标文件
        /// </summary>
        /// <param name="srcBuffer">指定的源字节数组</param>
        /// <param name="destFile">指定的目标文件</param>
        public static void CompressData(byte[] srcBuffer, string destFile)
        {
            FileStream destStream = null;
            GZipStream compressedStream = null;
            try
            {
                //打开文件流
                destStream = new FileStream(destFile, FileMode.OpenOrCreate, FileAccess.Write);
                //指定压缩的目的流(这里是文件流)
                compressedStream = new GZipStream(destStream, CompressionMode.Compress, true);
                //往目的流中写数据,而流将数据写到指定的文件
                compressedStream.Write(srcBuffer, 0, srcBuffer.Length);
            }
            catch (Exception ex)
            {
                throw new Exception(String.Format("压缩数据写入文件{0}时发生错误", destFile), ex);
            }
            finally
            {
                // Make sure we allways close all streams               
                if (null != compressedStream)
                {
                    compressedStream.Close();
                    compressedStream.Dispose();
                }

                if (null != destStream)
                    destStream.Close();
            }
        }
 

5.解压文件,得到byte[]数据

/// <summary>
        /// 将指定的文件解压,返回解压后的数据
        /// </summary>
        /// <param name="srcFile">指定的源文件</param>
        /// <returns>解压后得到的数据</returns>
        public static byte[] DecompressData(string srcFile)
        {
            if (false == File.Exists(srcFile))
                throw new FileNotFoundException(String.Format("找不到指定的文件{0}", srcFile));
            FileStream sourceStream = null;
            GZipStream decompressedStream = null;
            byte[] quartetBuffer = null;
            try
            {
                sourceStream = new FileStream(srcFile, FileMode.Open, FileAccess.Read, FileShare.Read);

                decompressedStream = new GZipStream(sourceStream, CompressionMode.Decompress, true);

                // Read the footer to determine the length of the destiantion file
                //GZIP文件格式说明:
                //10字节的头,包含幻数、版本号以及时间戳 
                //可选的扩展头,如原文件名 
                //文件体,包括DEFLATE压缩的数据 
                //8字节的尾注,包括CRC-32校验和以及未压缩的原始数据长度(4字节) 文件大小不超过4G 

                //为Data指定byte的长度,故意开大byte数据的范围
                //读取未压缩的原始数据长度
                quartetBuffer = new byte[4];
                long position = sourceStream.Length - 4;
                sourceStream.Position = position;
                sourceStream.Read(quartetBuffer, 0, 4);

                int checkLength = BitConverter.ToInt32(quartetBuffer, 0);
                byte[] data;
                if (checkLength <= sourceStream.Length)
                {
                    data = new byte[Int16.MaxValue];
                }
                else
                {
                    data = new byte[checkLength + 100];
                }
                //每100byte从解压流中读出数据,并将读出的数据Copy到Data byte[]中,这样就完成了对数据的解压
                byte[] buffer = new byte[100];

                sourceStream.Position = 0;

                int offset = 0;
                int total = 0;

                while (true)
                {
                    int bytesRead = decompressedStream.Read(buffer, 0, 100);

                    if (bytesRead == 0)
                        break;

                    buffer.CopyTo(data, offset);

                    offset += bytesRead;
                    total += bytesRead;
                }
                //剔除多余的byte
                byte[] actualdata = new byte[total];

                for (int i = 0; i < total; i++)
                    actualdata[i] = data[i];

                return actualdata;
            }
            catch (Exception ex)
            {
                throw new Exception(String.Format("从文件{0}解压数据时发生错误", srcFile), ex);
            }
            finally
            {
                if (sourceStream != null)
                    sourceStream.Close();

                if (decompressedStream != null)
                    decompressedStream.Close();
            }
        }
 

6.小结

压缩,解压都用GZipStream,操作的对象时普通流MemoryStream,不同的是:

压缩是将btye[]型的数据写入GZipStream中,而解压的时候是将GzipStream中的数据写入到byte[]中,并将读出的数据写入到MemoryStream后一次性输出

        压缩到文件与压缩成byte[]不同的是压缩到文件利用到了FileStream将流写到文件,解压Gzip文件,需要根据文件的规则进行:后4位记录未压缩前的长度,根据该长度可以将解压出来的文件存放到稍大的byte[]中

分享到:
评论

相关推荐

    实现内存Stream压缩解压缩 JPG 图像

    本文将深入探讨如何使用VB.NET(Visual Basic .NET)来实现内存Stream对JPG图像进行压缩和解压缩。 首先,我们需要了解JPEG(Joint Photographic Experts Group)格式,这是一种广泛用于存储和传输图像的有损压缩...

    ASP.NET 中的压缩和解压

    在ASP.NET中,为了实现文件的压缩和解压缩,我们可以利用.NET框架提供的`DeflateStream`和`GZipStream`类。这两个类位于`System.IO.Compression`命名空间下,它们分别对应DEFLATE和gzip两种不同的压缩算法,这两种...

    ASP.NET利用RAR实现文件压缩解压缩

    在本文中,我们将探讨如何在 ASP.NET 中利用 WinRAR 工具进行文件的压缩和解压缩操作。 首先,WinRAR 是一款流行的压缩软件,提供了命令行界面供用户执行各种压缩和解压缩任务。在 ASP.NET 应用中,可以借助系统...

    asp.net不错的压缩算法C#

    总结一下,ASP.NET 提供了丰富的压缩和解压缩工具,如 GZipStream、DeflateStream 和 ZipArchive,这些工具可以帮助开发者高效地处理文件和数据的压缩需求。通过灵活运用这些工具,开发者可以在 ASP.NET 应用程序中...

    如何压缩多个文件\文件夹(GZipStream and C#)

    `GZipStream`是这个命名空间中的一个关键类,它实现了GZIP压缩算法,可以用于处理数据流的压缩和解压缩。本篇文章将详细介绍如何利用`GZipStream`和C#进行文件或文件夹的压缩操作。 一、GZipStream介绍 GZipStream...

    .net压缩解压缩示例

    在.NET框架中,进行文件的压缩和解压缩是常见的任务,尤其在数据传输、存储优化或者备份场景下。本文将围绕".NET压缩解压缩示例"这个主题,深入讲解如何在.NET环境下使用SharpZLib库进行文件的压缩与解压缩操作。 ...

    GZipStream压缩文件称gzip格式

    在.NET框架中,`System.IO.Compression.GZipStream`类提供了处理gzip压缩和解压缩的功能。开发者可以使用这个类来读取或写入数据流,并将数据实时地压缩或解压缩。例如,你可以创建一个`FileStream`对象来读取或写入...

    .NET_Webservice数据压缩

    在.NET Framework中,GZipStream是一个用于压缩和解压缩数据的流类,它是System.IO.Compression命名空间的一部分。在Web服务中,我们可以将数据序列化为二进制形式,然后利用GZipStream进行压缩,再通过WebService...

    Asp.net2.0实现压缩/解压示例源码

    在Asp.NET 2.0框架中,开发人员经常需要处理文件的压缩和解压缩操作,这在数据传输、存储优化或提供下载服务时尤为重要。本示例源码旨在演示如何在ASP.NET环境中实现这一功能,使开发者能够方便地对文件和目录进行...

    asp.net在线压缩/解压缩

    在ASP.NET中,实现在线文件的压缩和解压缩功能是非常常见的需求,这有助于提高数据传输效率,减小网络流量。在给定的场景中,我们关注的核心知识点包括: 1. **文件操作**:在ASP.NET中,对文件的操作通常涉及`...

    Asp.net在线压缩解压简单实例

    在程序实现中,可能使用了.NET Framework或.NET Core的`System.IO.Compression`命名空间,该命名空间提供了GZipStream、DeflateStream等类用于压缩和解压缩数据。然而,由于RAR格式不被内置支持,所以可能需要借助第...

    一个基于C#开发的压缩与解压Compress and Decompress类库源码

    总结来说,这个基于C#的Compress and Decompress类库源码主要关注于利用.NET Framework的GZipStream类实现文件的压缩和解压缩,这对于C#开发者来说,是一个很好的学习资源,可以帮助他们掌握数据压缩技术,并在实际...

    zlib.NET zlibCe.NET

    Zlib.NET是由GzipFile和DeflateStream类提供的.NET Framework上的一个接口,它允许开发者在C#或VB.NET等.NET语言中轻松地进行数据压缩和解压缩。Zlib.NET实现了DEFLATE压缩算法,这是ZIP、PNG和其他许多文件格式的...

    C#使用GZipStream实现文件的压缩与解压

    GZipStream是.NET Framework中的一个类,用于压缩和解压缩数据流。它支持使用GZIP算法对数据流进行压缩和解压缩。 在C#中使用GZipStream实现文件的压缩与解压需要引入System.IO.Compression命名空间。GZipStream类...

    .NET压缩传输数据集

    在`描述`中提到的`DataSetSurrogate.dll`,这很可能是一个自定义的dll组件,它提供了专门针对DataSet对象的序列化和反序列化的功能,可能还包括压缩和解压缩的实现。通常,这样的组件会封装上述的压缩过程,使开发者...

    asp.net 压缩解压控件

    在.NET框架中,文件压缩和解压缩可以借助System.IO.Compression命名空间中的类来实现,如GZipStream和DeflateStream。然而,这些基本类可能需要编写较多的代码才能在ASP.NET页面上实现用户友好的交互。因此,专用的...

    数据压缩.NET源码

    在压缩包中的"数据压缩源码"文件,很可能是提供了一些具体的VB.NET代码示例,展示如何使用上述.NET框架提供的类来压缩和解压缩数据。这些示例可以帮助开发者理解如何在实际项目中集成压缩功能,比如在文件上传、下载...

    C#压缩和解压缩文件的经典源码

    首先,C#中实现压缩和解压缩功能主要依赖于.NET Framework提供的System.IO.Compression命名空间,它包含了GZipStream和DeflateStream类,可以实现GZIP和DEFLATE两种压缩算法。此外,ZipArchive类则提供了对ZIP文件...

    zlib.NET_104 zlib C#版

    【zlib.NET_104 zlib C#版】是一个针对C#编程语言的开源库,它实现了著名的zlib压缩算法,使得.NET开发者可以方便地在他们的应用中进行数据压缩和解压缩操作。zlib是由Jean-loup Gailly和Mark Adler开发的一个无损...

Global site tag (gtag.js) - Google Analytics