首页 > 编程语言 >使用GZipStream类在C#中进行数据压缩和解压缩操作

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

时间:2024-07-31 16:17:45浏览次数:13  
标签:some C# 解压缩 compress GZipStream text GZip using

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类实现压缩和解压缩功能。这对于需要减少存储空间或提高网络传输效率的应用非常有用

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

运行结果:

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.

参考

标签:some,C#,解压缩,compress,GZipStream,text,GZip,using
From: https://www.cnblogs.com/vinciyan/p/18334898

相关文章

  • 暑假集训csp提高模拟12
    赛时rank47,T1100,T20,T30,T420做题策略不好,没做T2,死在T4上了。感觉赛时就是唐。T1黑客考虑枚举结果,如果存在贡献,那么一定有\(i+j=k\&gcd(i,j)=1\),统计一下有多少组即可点此查看代码#include<bits/stdc++.h>#include<bits/extc++.h>//usingnamespace__gnu_pbds;......
  • 完美使用 Google Cloud Run:为单个作业中的每个流程创建新的执行 ID
    我目前正在使用Prefect云来编排不同的任务,并且我正在使用CloudRunPush工作池将这些任务作为作业部署在GoogleCloudRun上。这是我面临的情况:每次运行流程时,它都会创建一个新的任务在CloudRun上工作。然而,这不是我想要的行为。相反,我希望每个部署都有一个作业,具有......
  • STM32学习记录(七):ADC
    STM32学习记录(七):ADC模拟/数字转换器(Analog-to-digitalconverter:ADC)将模拟量转为数字量。STM32F103C8T6中的有2个12bit转换时间为1us的A/D转换器,内置了一个温度传感器,可以通过ADC读取。ADC的系统框图ADC读取温度传感器STM32内部有一个温度传感器,只有使用ADC1时,内部温度......
  • Python:使用默认模块在python中读取excel
    我有Python2.6.6版本,但无法安装pandas、xlrd、xlwt等新模块。我想使用Python读取Excel。是否可以使用Python中存在的默认模块读取Excel。抱歉,不能使用Python2.6.6的默认模块读取Excel文件。Python没有内置的功能来处理Excel文件。使用外部库(如提......
  • 属性错误:'numpy.int64'。这是我的对象没有属性“loc”
    我试图根据2列的if条件求和一列的值,但出现错误AttributeError:'numpy.int64'这是我的对象没有属性locdf3=df3.loc[(df3['FeatureName']=='GI-MIPSPI-FilterScorecardDataPanel-Measures(All)-PI_HIE_1:SupportElectronicReferralLoo......
  • rocketmq普通消息-消息类型
    引用普通消息发送|RocketMQ异步调用的经典业务场景_使用异步的业务场景-CSDN博客同步消息类型Send消息发送方发出一条消息后,会在收到服务端同步响应之后才发下一条消息的通讯方式,可靠的同步传输被广泛应用于各种场景,如重要的通知消息、短消息通知等。用途1.重要通知......
  • 基于KNN-GCN的滚动轴承故障诊断
    数据集:CRWU数据集框架:pytorchtorch-geometric一、数据集​CWRU轴承数据集采集实验台由1.5kW的电机、驱动端轴承、风扇端轴承、扭矩传感器、测功机、加速度传感器和电子控制器组成。待检测的轴承支撑着电动机的转轴,驱动端轴承型号为SKF6205,风扇端轴承型号为SKF6203,本文中使......
  • 【复健】LCA复健笔记
    LCA复健笔记展开目录目录LCA复健笔记什么是LCA怎么求LCA暴力求LCA倍增优化应用场景不适合的应用场景什么是LCA最近公共祖先/最深公共祖先,顾名思义,两个点的公共祖先中离它们最近/深度最大的那个。怎么求LCA这里使用倍增优化算法,因为之前看不懂所以我觉得应该补一下......
  • Linux中expect命令使用报错“invalid command name “Y“ while executing “Y“ invo
    1.执行expect命令的时候一直在报错:spawnshsetup.sh#invalidcommandname"Y"  whileexecuting"Y"  invokedfromwithin"expect"[Y]Yes,Iagree. [N]No,Idon'tagree."",如下图所示:其中的源码:    /usr/bin/expect&l......
  • 【STM32 HAL库】HC-05 蓝牙通信
    【STM32HAL库】蓝牙通信理论模块功能接线应用CubeMX配置轮询模式发送DMA模式发送Keil5代码理论模块功能将复杂的蓝牙协议简化为串口透传即以HC-05作为串口与主机之间通信的桥梁,实现串口与主机的通信本质上就是无线的串口通信接线HC-05STM32TXRXRXTXGNDGNDV......