最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中對字符串進(jìn)行壓縮和解壓的實現(xiàn)

 更新時間:2022年08月02日 11:06:44   作者:DebugUsery  
本文主要介紹了C#中對字符串進(jìn)行壓縮和解壓的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

利用GZip和Brotli壓縮方法的優(yōu)勢,減少字符串?dāng)?shù)據(jù)的大小,提高.NET核心應(yīng)用程序的性能。

在開發(fā)應(yīng)用程序時,你經(jīng)常需要處理字符串。由于字符串對象在性能方面的成本很高,你經(jīng)常想壓縮你的字符串內(nèi)容,即字符串對象中的數(shù)據(jù),以減少有效載荷。有幾個庫可以做到這一點,但兩個流行的技術(shù)是GZip和Brotli。

在這篇文章中,我們將討論如何在C#中使用GZip和Brotli算法對字符串進(jìn)行壓縮和解壓。要使用這里提供的代碼示例,你的系統(tǒng)中應(yīng)該安裝有Visual Studio 2022。如果你還沒有副本,你可以在這里下載Visual Studio 2022。

在Visual Studio 2022中創(chuàng)建一個控制臺應(yīng)用程序項目

首先,讓我們在Visual Studio中創(chuàng)建一個.NET Core控制臺應(yīng)用程序項目。假設(shè)你的系統(tǒng)中已經(jīng)安裝了Visual Studio 2022,按照下面的步驟創(chuàng)建一個新的.NET Core控制臺應(yīng)用程序項目:

  • 啟動Visual Studio IDE。
  • 點擊 "創(chuàng)建一個新項目"。
  • 在 "創(chuàng)建一個新項目 "窗口中,從顯示的模板列表中選擇 "控制臺應(yīng)用程序"。
  • 點擊 "下一步"。
  • 在接下來顯示的 "配置你的新項目 "窗口中,指定新項目的名稱和位置。
  • 在 "其他信息 "窗口中,選擇.NET 6.0作為運行時間,然后點擊下一步。
  • 點擊 "創(chuàng)建"。

我們將使用這個項目來說明下面的字符串壓縮和解壓縮。但首先我們要安裝一個基準(zhǔn)測試包BenchmarkDotNet,它將使我們能夠衡量我們從壓縮中獲得的好處。

安裝BenchmarkDotNet NuGet包

基準(zhǔn)測試代碼對于了解你的應(yīng)用程序的性能至關(guān)重要。在這篇文章中,我們將利用BenchmarkDotNet來跟蹤方法的性能。

要使用BenchmarkDotNet,你必須安裝BenchmarkDotNet軟件包。你可以通過Visual Studio 2022里面的NuGet軟件包管理器,或者在NuGet軟件包管理器控制臺執(zhí)行以下命令來完成。

Install-Package BenchmarkDotNet

C#中的System.IO.Compression命名空間

System.IO.Compression命名空間包括壓縮文件和字符串的方法。它包含兩種壓縮算法。GZip 和 Brotli。在接下來的章節(jié)中,我們將研究如何在C#中使用GZip和Brotli壓縮算法對字符串?dāng)?shù)據(jù)進(jìn)行壓縮和解壓。

我們將在下面的例子中使用以下文本。

string originalString = "To work with BenchmarkDotNet you must install the BenchmarkDotNet package. " +
"You can do this either via the NuGet Package Manager inside the Visual Studio 2019 IDE, " +
"or by executing the Install-Package BenchmarkDotNet command at the NuGet Package Manager Console";

在C#中使用GZip對數(shù)據(jù)進(jìn)行壓縮和解壓

下面的代碼片斷顯示了如何在C#中使用GZipStream類來壓縮數(shù)據(jù)。注意,壓縮方法的參數(shù)是一個字節(jié)數(shù)組:

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

要解壓使用GZip算法壓縮過的數(shù)據(jù),我們可以使用以下方法:

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

運行GZip壓縮算法

你可以使用下面的代碼片斷來執(zhí)行我們剛剛創(chuàng)建的GZip壓縮方法:

byte[] dataToCompress = Encoding.UTF8.GetBytes(originalString);
byte[] compressedData = GZipCompressor.Compress(dataToCompress);
string compressedString = Encoding.UTF8.GetString(compressedData);
Console.WriteLine("Length of compressed string: " + compressedString.Length);
byte[] decompressedData = GZipCompressor.Decompress(compressedData);
string deCompressedString = Encoding.UTF8.GetString(decompressedData);
Console.WriteLine("Length of decompressed string: " + deCompressedString.Length);

當(dāng)你運行上述代碼時,你會在控制臺窗口看到以下輸出:

圖1.GZip將原來259個字符的字符串壓縮成167個字符。

請注意,GZip從原始的259個字符的字符串中修剪了92個字符。因為原始字符串和解壓后的字符串應(yīng)該是相同的,它們的長度也應(yīng)該是相同的。

在C#中使用Brotli對數(shù)據(jù)進(jìn)行壓縮和解壓

下面的代碼片斷說明了如何在C#中使用BrotliStream類來壓縮數(shù)據(jù)。與上面的GZip例子一樣,注意壓縮方法的參數(shù)是一個字節(jié)數(shù)組:

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

而這里是你如何使用BrotliStream來解壓數(shù)據(jù)的:

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

運行Brotli壓縮算法

下面的代碼片斷顯示了你如何使用我們上面創(chuàng)建的Brotli壓縮方法來壓縮一個字符串:

Console.WriteLine("Length of original string: " + originalString.Length);
byte[] dataToCompress = Encoding.UTF8.GetBytes(originalString);
byte[] compressedData = BrotliCompressor.Compress(dataToCompress);
string compressedString = Convert.ToBase64String(compressedData);
Console.WriteLine("Length of compressed string: " + compressedString.Length);
byte[] decompressedData = BrotliCompressor.Decompress(compressedData);
string deCompressedString = Convert.ToBase64String(decompressedData);
Console.WriteLine("Length of decompressed string: " + deCompressedString.Length);

當(dāng)你運行該程序時,你將在控制臺窗口看到以下輸出:

圖2.Brotli將原來259個字符的字符串壓縮成121個字符。

正如你所看到的,Brotli的壓縮效果比GZip好得多。然而,壓縮率并不是故事的全部,我們將在下面看到。

用GZip和Brotli進(jìn)行異步壓縮和解壓

請注意,我們之前使用的壓縮和解壓方法也有異步的對應(yīng)方法。這里是使用GZip算法的壓縮和解壓方法的異步版本:

public async static Task<byte[]> CompressAsync(byte[] bytes)
        {
            using (var memoryStream = new MemoryStream())
            {
                using (var gzipStream = new GZipStream(memoryStream, CompressionLevel.Optimal))
                {
                    await gzipStream.WriteAsync(bytes, 0, bytes.Length);
                }
                return memoryStream.ToArray();
            }
        }
public async static Task<byte[]> DecompressAsync(byte[] bytes)
        {
            using (var memoryStream = new MemoryStream(bytes))
            {
                using (var outputStream = new MemoryStream())
                {
                    using (var decompressStream = new GZipStream(memoryStream, CompressionMode.Decompress))
                    {
                        await decompressStream.CopyToAsync(outputStream);
                    }
                    return outputStream.ToArray();
                }
            }
        }

這里是使用Brotli的壓縮和解壓方法的異步版本:

public static async Task<byte[]> CompressAsync(byte[] bytes)
        {
            using (var memoryStream = new MemoryStream())
            {
                using (var brotliStream = new BrotliStream(memoryStream, CompressionLevel.Optimal))
                {
                    await brotliStream.WriteAsync(bytes, 0, bytes.Length);
                }
                return memoryStream.ToArray();
            }
        }
public static async Task<byte[]> DecompressAsync(byte[] bytes)
        {
            using (var memoryStream = new MemoryStream(bytes))
            {
                using (var outputStream = new MemoryStream())
                {
                    using (var brotliStream = new BrotliStream(memoryStream, CompressionMode.Decompress))
                    {
                        await brotliStream.CopyToAsync(outputStream);
                    }
                    return outputStream.ToArray();
                }
            }
        }

在C#中用GZip和Brotli進(jìn)行壓縮和解壓的基準(zhǔn)測試

在我們之前創(chuàng)建的控制臺應(yīng)用程序項目中,創(chuàng)建一個名為BenchmarkCompression.cs的新文件并輸入以下代碼:

[MemoryDiagnoser]
[Orderer(BenchmarkDotNet.Order.SummaryOrderPolicy.FastestToSlowest)]
[RankColumn]
public class BenchmarkCompression
    {
        string originalString = "To work with BenchmarkDotNet you must install the BenchmarkDotNet package. " +
            "You can do this either via the NuGet Package Manager inside the Visual Studio 2019 IDE, " +
            "or by executing the Install-Package BenchmarkDotNet command at the NuGet Package Manager Console";

        [Benchmark]
        public void GZipCompress()
        {
            byte[] dataToCompress = Encoding.UTF8.GetBytes(originalString);
            var compressedData = GZipCompressor.Compress(dataToCompress);
        }

        [Benchmark]
        public void BrotliCompress()
        {
            byte[] dataToCompress = Encoding.UTF8.GetBytes(originalString);
            var compressedData = BrotliCompressor.Compress(dataToCompress); 
        }
    }

當(dāng)你運行基準(zhǔn)時,你應(yīng)該看到類似于下面圖3所示的控制臺輸出。

圖3.來自BenchmarkDotNet的結(jié)果...GZip贏了!

顯然,在選擇壓縮算法時,壓縮率并不是唯一的考慮因素。盡管與GZip相比,你可以使用Brotli實現(xiàn)更好的壓縮,但額外的壓縮是以性能為代價的。GZip在壓縮和解壓數(shù)據(jù)方面明顯比Brotli快。

當(dāng)對你的.NET應(yīng)用程序進(jìn)行基準(zhǔn)測試時,你應(yīng)該始終確保你的項目在發(fā)布模式下運行。原因是編譯器為調(diào)試和發(fā)布模式優(yōu)化代碼的方式不同。關(guān)于基準(zhǔn)測試和應(yīng)用程序的性能,我在以后的文章中會有更多論述。

到此這篇關(guān)于C#中對字符串進(jìn)行壓縮和解壓的實現(xiàn)的文章就介紹到這了,更多相關(guān)C# 字符串壓縮和解壓內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C# Winform 實現(xiàn)控件自適應(yīng)父容器大小的示例代碼

    C# Winform 實現(xiàn)控件自適應(yīng)父容器大小的示例代碼

    這篇文章主要介紹了C# Winform 實現(xiàn)控件自適應(yīng)父容器大小的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C#中if語句使用概述

    C#中if語句使用概述

    這里介紹C#使用if語句,C#使用if語句中的表達(dá)式必須放在一對圓括號中。除此之外,表達(dá)式必須是布爾表達(dá)式
    2014-03-03
  • C# Winform實現(xiàn)自定義漂亮的通知效果

    C# Winform實現(xiàn)自定義漂亮的通知效果

    這篇文章主要介紹了C# Winform實現(xiàn)自定義漂亮的通知效果,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 親自教你實現(xiàn)棧及C#中Stack源碼分析

    親自教你實現(xiàn)棧及C#中Stack源碼分析

    大家都知道棧的實現(xiàn)方式有兩種,一種是基于數(shù)組實現(xiàn)的順序棧,另一種是基于鏈表實現(xiàn)的鏈?zhǔn)綏?。這篇文章主要介紹了手把手教你實現(xiàn)棧以及C#中Stack源碼分析,需要的朋友可以參考下
    2021-09-09
  • 基于C#后臺調(diào)用跨域MVC服務(wù)及帶Cookie驗證的實現(xiàn)

    基于C#后臺調(diào)用跨域MVC服務(wù)及帶Cookie驗證的實現(xiàn)

    本篇文章介紹了,基于C#后臺調(diào)用跨域MVC服務(wù)及帶Cookie驗證的實現(xiàn)。需要的朋友參考下
    2013-04-04
  • C#獲取數(shù)組中最大最小值的方法

    C#獲取數(shù)組中最大最小值的方法

    這篇文章主要介紹了C#獲取數(shù)組中最大最小值的方法,本文直接給出實例代碼,需要的朋友可以參考下
    2015-06-06
  • C#?LiteDB基本使用示例代碼

    C#?LiteDB基本使用示例代碼

    LiteDB是一種文檔型單文件數(shù)據(jù)庫,基于Key-Value方式存取數(shù)據(jù),LiteDB?的靈感來自?MongoDB?數(shù)據(jù)庫,所以它的?API?和?MongoDB?的?.NET?API?非常相似,這篇文章主要介紹了C#?LiteDB基本使用,需要的朋友可以參考下
    2024-03-03
  • C#8.0中的索引與范圍功能介紹

    C#8.0中的索引與范圍功能介紹

    這篇文章介紹了C#8.0中的索引與范圍功能,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • c#中禁用windows的任務(wù)管理器的方法

    c#中禁用windows的任務(wù)管理器的方法

    這篇文章主要介紹了c#中禁用windows的任務(wù)管理器的方法,通過注冊表實現(xiàn)禁用,需要的朋友可以參考下
    2014-06-06
  • 深入理解.NET中的異步

    深入理解.NET中的異步

    異步編程是程序設(shè)計的重點,在實際的項目,在大量的數(shù)據(jù)入庫以及查詢數(shù)據(jù)并進(jìn)行計算的時候,程序的UI界面往往卡死在那里,這時候就需要對計算時間限制的過程進(jìn)行異步處理,同時正確的使用異步編程去處理計算限制的操作和耗時IO操作還能提升的應(yīng)用程序的吞吐量及性能
    2021-06-06

最新評論

东台市| 岳阳县| 清丰县| 黄平县| 棋牌| 沙河市| 五原县| 香河县| 尚义县| 饶河县| 汝城县| 德兴市| 湖北省| 玉山县| 灵石县| 马关县| 凤阳县| 建昌县| 石阡县| 那坡县| 驻马店市| 海阳市| 涿鹿县| 渑池县| 呼图壁县| 石阡县| 南开区| 芒康县| 阳春市| 缙云县| 大港区| 绍兴县| 和硕县| 会昌县| 吐鲁番市| 长泰县| 永昌县| 广宁县| 龙胜| 毕节市| 新竹县|