<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在開發應用程式時,你經常需要處理字串。由於字串物件在效能方面的成本很高,你經常想壓縮你的字串內容,即字串物件中的資料,以減少有效載荷。有幾個庫可以做到這一點,但兩個流行的技術是GZip和Brotli。
在這篇文章中,我們將討論如何在C#中使用GZip和Brotli演演算法對字串進行壓縮和解壓。要使用這裡提供的程式碼範例,你的系統中應該安裝有Visual Studio 2022。如果你還沒有副本,你可以在這裡下載Visual Studio 2022。
首先,讓我們在Visual Studio中建立一個.NET Core控制檯應用程式專案。假設你的系統中已經安裝了Visual Studio 2022,按照下面的步驟建立一個新的.NET Core控制檯應用程式專案:
我們將使用這個專案來說明下面的字串壓縮和解壓縮。但首先我們要安裝一個基準測試包BenchmarkDotNet,它將使我們能夠衡量我們從壓縮中獲得的好處。
基準測試程式碼對於瞭解你的應用程式的效能至關重要。在這篇文章中,我們將利用BenchmarkDotNet來跟蹤方法的效能。
要使用BenchmarkDotNet,你必須安裝BenchmarkDotNet軟體包。你可以通過Visual Studio 2022裡面的NuGet軟體包管理器,或者在NuGet軟體包管理器控制檯執行以下命令來完成。
Install-Package BenchmarkDotNet
System.IO.Compression名稱空間包括壓縮檔案和字串的方法。它包含兩種壓縮演演算法。GZip 和 Brotli。在接下來的章節中,我們將研究如何在C#中使用GZip和Brotli壓縮演演算法對字串資料進行壓縮和解壓。
我們將在下面的例子中使用以下文字。
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#中使用GZipStream類來壓縮資料。注意,壓縮方法的引數是一個位元組陣列:
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演演算法壓縮過的資料,我們可以使用以下方法:
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壓縮方法:
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);
當你執行上述程式碼時,你會在控制檯視窗看到以下輸出:
圖1.GZip將原來259個字元的字串壓縮成167個字元。
請注意,GZip從原始的259個字元的字串中修剪了92個字元。因為原始字串和解壓後的字串應該是相同的,它們的長度也應該是相同的。
下面的程式碼片斷說明了如何在C#中使用BrotliStream類來壓縮資料。與上面的GZip例子一樣,注意壓縮方法的引數是一個位元組陣列:
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來解壓資料的:
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壓縮方法來壓縮一個字串:
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);
當你執行該程式時,你將在控制檯視窗看到以下輸出:
圖2.Brotli將原來259個字元的字串壓縮成121個字元。
正如你所看到的,Brotli的壓縮效果比GZip好得多。然而,壓縮率並不是故事的全部,我們將在下面看到。
請注意,我們之前使用的壓縮和解壓方法也有非同步的對應方法。這裡是使用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(); } } }
在我們之前建立的控制檯應用程式專案中,建立一個名為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); } }
當你執行基準時,你應該看到類似於下面圖3所示的控制檯輸出。
圖3.來自BenchmarkDotNet的結果...GZip贏了!
顯然,在選擇壓縮演演算法時,壓縮率並不是唯一的考慮因素。儘管與GZip相比,你可以使用Brotli實現更好的壓縮,但額外的壓縮是以效能為代價的。GZip在壓縮和解壓資料方面明顯比Brotli快。
當對你的.NET應用程式進行基準測試時,你應該始終確保你的專案在釋出模式下執行。原因是編譯器為偵錯和釋出模式優化程式碼的方式不同。關於基準測試和應用程式的效能,我在以後的文章中會有更多論述。
到此這篇關於C#中對字串進行壓縮和解壓的實現的文章就介紹到這了,更多相關C# 字串壓縮和解壓內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45