使用GZipStream类在C#中进行数据压缩和解压缩操作

GZipStream是.NET中用于实现GZip算法的类。GZip是一种用于压缩和解压缩数据的算法,广泛应用于文件压缩和网络传输等场景

GZip算法简介

GZip是基于DEFLATE算法的压缩方法,由Jean-Loup Gailly和Mark Adler创建,最初用于Unix系统中的gzip工具。GZip主要用于减少文件大小以便更高效地存储和传输数据

GZipStream类

在.NET中,GZipStream类位于System.IO.Compression命名空间中,提供了使用GZip算法进行数据压缩和解压缩的功能。GZipStream类继承自Stream类,因此可以与其他流操作类(如MemoryStream和FileStream)一起使用

实例

这段代码展示了如何使用GZipStream类在C#中进行数据压缩和解压缩操作。它展示了如何将一个字符串转换为字节数组,使用GZip算法进行压缩,然后再将其解压缩回原始字符串。通过这个示例,我们可以看到压缩算法在处理具有重复模式的数据时是如何工作的,以及如何利用MemoryStream和GZipStream类实现压缩和解压缩功能。这对于需要减少存储空间或提高网络传输效率的应用非常有用

cs 复制代码
using System;
using System.IO;
using System.IO.Compression;
using System.Text;

class Program
{
    static void Main()
    {
        // 原始数据,可以是任意字节数组
        string originalData = "This is some text that we want to compress using GZip. " +
                              "This is some text that we want to compress using GZip. " +
                              "This is some text that we want to compress using GZip. " +
                              "This is some text that we want to compress using GZip. " +
                              "This is some text that we want to compress using GZip.";
        byte[] originalBytes = Encoding.UTF8.GetBytes(originalData);

        // 调用 Compress 方法压缩数据
        byte[] compressedBytes = Compress(originalBytes);

        // 输出原始数据和压缩后的数据大小
        Console.WriteLine($"Original Size: {originalBytes.Length} bytes");
        Console.WriteLine($"Compressed Size: {compressedBytes.Length} bytes");

        // 调用 Decompress 方法解压缩数据
        byte[] decompressedBytes = Decompress(compressedBytes);
        string decompressedData = Encoding.UTF8.GetString(decompressedBytes);

        // 验证解压缩后的数据是否与原始数据相同
        Console.WriteLine($"Decompressed Data: {decompressedData}");
    }

    public static byte[] Compress(byte[] bytes)
    {
        using (var memoryStream = new MemoryStream())
        {
            using (var gzipStream = new GZipStream(memoryStream, CompressionLevel.Optimal))
            {
                gzipStream.Write(bytes, 0, bytes.Length);
            }
            return memoryStream.ToArray();
        }
    }

    public static byte[] Decompress(byte[] bytes)
    {
        using (var memoryStream = new MemoryStream(bytes))
        {
            using (var outputStream = new MemoryStream())
            {
                using (var decompressStream = new GZipStream(memoryStream, CompressionMode.Decompress))
                {
                    decompressStream.CopyTo(outputStream);
                }
                return outputStream.ToArray();
            }
        }
    }
}

运行结果:

cs 复制代码
Original Size: 274 bytes
Compressed Size: 76 bytes
Decompressed Data: This is some text that we want to compress using GZip. This is some text that we want to compress using GZip. This is some text that we want to compress using GZip. This is some text that we want to compress using GZip. This is some text that we want to compress using GZip.

参考

相关推荐
凡人叶枫7 分钟前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
GetcharZp24 分钟前
别再盲目用 OpenCV 读图了,这才是 CV 预处理的终极杀手锏!
后端
学逆向的31 分钟前
C++纯虚函数
开发语言·c++·网络安全
程序员二叉1 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉1 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
JaydenAI1 小时前
[对比学习LangChain和MAF-07]如何引入人机交互的审批流程
python·ai·langchain·c#·agent·hitl·maf
凡人叶枫2 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
Qt程序员2 小时前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言
code bean2 小时前
【LangChain】检索器完全指南:从向量检索到生产级 RAG 架构
java·开发语言·微服务
LabVIEW开发2 小时前
LabVIEW + MATLAB 混合编程:爆炸场测试数据精准采集方案
开发语言·matlab·labview