使用 StringZipper 壓縮、解壓字符串

數據壓縮是一個軟件開發中的常見需求:很多時候需要先將較大的數據進行壓縮然后再通過網絡等進行傳輸。

在 .NET 中,有多個壓縮算法供我們選擇:Deflate、GZip 和 Br 。這些壓縮算法都是基于流(Stream)的,在對字符串壓縮前需要先將其轉換成字節數組。

還有一個比較常見的壓縮算法是:lz-string 。其官方文檔在這里:

https://pieroxy.net/blog/pages/lz-string/index.html

壓縮后的數據一般是流或者字節數組,在壓縮字符串的場景下,期望的壓縮結果大概率也是字符串。常見的字節數組編碼方式有以下幾種:

  • Base16

  • Base62

  • Base64

  • Ascii85

不同的壓縮算法對應了不同的解壓縮算法。同樣的,不同的編碼算法也對應了不同的解碼算法。為了降低使用難度,可以在壓縮結果中將使用的壓縮算法和編碼算法嵌入,這樣就可以使用一個解壓縮方法去解壓任意支持的數據。

LuYao.Common

基于上述考慮,筆者編寫了一個名為?StringZipper?的靜態類用于輔助進行字符串的壓縮和解壓縮。該類屬于?LuYao.Common?,可以在 NuGet 下載:

https://www.nuget.org/packages/LuYao.Common/

StringZipper 的成員

public static class StringZipper
{public interface ICompressor{string Identifier { get; }byte[] Compress(string value);string Decompress(byte[] data);}public interface IEncoder{string Identifier { get; }string Encode(byte[] data);byte[] Decode(string value);}public static IEncoder Base16 { get; }public static IEncoder Base62 { get; }public static IEncoder Base64 { get; }public static IEncoder Ascii85 { get; }public static ICompressor LzString { get; }public static ICompressor Deflate { get; }public static ICompressor GZip { get; }public static ICompressor Br { get; }private static void Register(string identifier, object component);public static void Register(ICompressor compresser);public static void Register(IEncoder encoder);public static bool TryGetComponent<T>(string id, out T component);public static string Zip(string str, ICompressor compressor, IEncoder encoder);public static string Zip(string str);public static string Unzip(string str);
}

使用 StringZipper 壓縮字符串

最簡單的使用方式就是直接調用?StringZipper?的?Zip?方法,默認情況下會使用 Deflate 壓縮算法和 Ascii85 編碼:

using LuYao;
var input = "man is distinguished, not only by his reason, but also by this singular passion from other animals; in whom the appetite of food, and other pleasures of sense, by predominance, take away the care of knowing causes; which is a lust of the mind, that by a perseverance of delight in the continual and indefatigable generation of knowledge, exceedeth the short vehemence of any carnal pleasure.";
var output = StringZipper.Zip(input);
Console.WriteLine(output);var bytesFrom = Encoding.UTF8.GetByteCount(input);
var bytesTo = Encoding.UTF8.GetByteCount(output);Console.WriteLine("{0} => {1} {2:0.##%}",bytesFrom,bytesTo,1d*bytesTo/bytesFrom);

輸出:

data:text/x-deflate;ascii85,<~23?4J`%VHa>G6S<CZ)39YnDE7!KY'd9D=2tfhW"J,^cgm0hTEta?GJmU_ekKWRQilMfOb<fMl1a$n&3T;ti;VBr]sfYusqtXm8:<)4amP&^.pgK[(QXW5PgSMh?,H9f94YdUQrJ@Rc-tTg9*LGZ!ctH5'dj6Z@JZjlBPEZuWoYDp^A@`-W=Fo#t[io.[%&/<8EOoq4^IBD)XDC?UB_qF&Z#KNe*9ZggakM-h-*mulYK`a3gp.VOTjcf`PKIRVtc+T>Ca_=NYjXPN,nMuui]b;FW>@)!NXquZ~>
391 => 320 81.84%

如果需要使用其他的壓縮算法或編碼方式,Zip?方法有一個需要三個參數的重載,將對應的靜態屬性傳入即可。如果需要使用 Br 壓縮和 Base64 編碼,則可以使用以下代碼:

var output = StringZipper.Zip(input, StringZipper.Br,StringZipper.Base62);

使用 StringZipper 解壓字符串

與壓縮時可以指定壓縮和編碼方式相比,解壓縮只有一個方法:?Unzip?。該方法會自動判斷傳入的字符串是否被壓縮以及壓縮時使用的參數:

using LuYao;
var input = "data:text/x-deflate;ascii85,<~23?4J`%VHa>G6S<CZ)39YnDE7!KY'd9D=2tfhW\"J,^cgm0hTEta?GJmU_ekKWRQilMfOb<fMl1a$n&3T;ti;VBr]sfYusqtXm8:<)4amP&^.pgK[(QXW5PgSMh?,H9f94YdUQrJ@Rc-tTg9*LGZ!ctH5'dj6Z@JZjlBPEZuWoYDp^A@`-W=Fo#t[io.[%&/<8EOoq4^IBD)XDC?UB_qF&Z#KNe*9ZggakM-h-*mulYK`a3gp.VOTjcf`PKIRVtc+T>Ca_=NYjXPN,nMuui]b;FW>@)!NXquZ~>";
var output = StringZipper.Unzip(input);
Console.WriteLine(output);

輸出:

man is distinguished, not only by his reason, but also by this singular passion from other animals; in whom the appetite of food, and other pleasures of sense, by predominance, take away the care of knowing causes; which is a lust of the mind, that by a perseverance of delight in the continual and indefatigable generation of knowledge, exceedeth the short vehemence of any carnal pleasure.

路遙工具箱中的功能集成

路遙工具箱已經內置了【文本壓縮】功能,在【文字處理】菜單下。其采用的壓縮、解壓算法與本文所采用的相同。這就代表著可以在開發或者調試時很容易對已壓縮的數據進行解壓,提高軟件開發的效率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284982.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284982.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284982.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【轉載】【面試題】你是一個測試工程師,如何保證軟件質量?

2019獨角獸企業重金招聘Python工程師標準>>> *參*答*案&#xff1a;質量是有層次&#xff08;內部質量&#xff0c;外部質量&#xff0c;使用質量&#xff0c;過程質量&#xff09; 內部質量&#xff1a;主要指代碼的質量&#xff0c;就需要引入開發工程師進…

C語言試題186之讀取范圍在1和標準輸入讀取的size之前每個數據出現的次數

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 讀取范…

[轉]常見的用戶密碼加密方式以及破解方法

【作者】張輝&#xff0c;就職于攜程技術中心信息安全部&#xff0c;負責安全產品的設計與研發。 作為互聯網公司的信息安全從業人員經常要處理撞庫掃號事件&#xff0c;產生撞庫掃號的根本原因是一些企業發生了信息泄露事件&#xff0c;且這些泄露數據未加密或者加密方式比較弱…

H5學習筆記

什么是 HTML&#xff1f; HTML 是用來描述網頁的一種語言。 HTML 指的是超文本標記語言 (Hyper Text Markup Language)HTML 不是一種編程語言&#xff0c;而是一種標記語言 (markup language)標記語言是一套標記標簽 (markup tag)HTML 使用標記標簽來描述網頁關鍵字&#xff1a…

【ArcGIS遇上Python】ArcGIS Python獲取某個字段的唯一值(獲取指定字段的不同屬性值)

以土地利用數據為例,DLMC字段為每個圖斑的用地類型,怎樣用Python代碼獲取該字段的屬性唯一值? Python代碼實現結果: Python源代碼: import arcpy from arcpy import env arcpy.gp.overwriteOutput=

一張圖解決Android Studio 項目運行按鈕灰色

轉載于:https://juejin.im/post/5a31ee46f265da430406a166

java學習筆記8--接口總結

生活中的接口&#xff1a; 什么是接口? 一個Java接口是一些方法特征的集合&#xff0c;但沒有方法的實現。 在類中實現接口可以使用關鍵字implements&#xff0c;其基本格式如下&#xff1a; [修飾符] class <類名> [extends 父類名] [implements 接口列表]{}修飾符&…

.NET自定義認證雖然簡單,但好用

前言有這樣一種場景&#xff0c;就是新項目已經集成了認證中心&#xff0c;或者是都用了統一的認證方式(比如現在常用的JWT)&#xff0c;這樣對于項目之間的對接就顯得比較方便&#xff0c;至少在認證這塊還是能減少一些工作量的。但當上線的老項目需要對接新項目時&#xff0c…

C語言試題187之實現strspn函數功能

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 實現st…

一張圖對比騰訊、阿里、百度的薪資職級

作為中國互聯網三大巨頭的騰訊、阿里、百度&#xff0c;他們的職級薪資福利等等等一直都是個謎&#xff0c;不為外界所知。今天&#xff0c;我就來為大家全面揭曉—— Here we go&#xff5e; 公司總部 - 騰訊&#xff1a;總部在深圳南山科技園&#xff0c;CBD地段&#xff1…

旺財速啃H5框架之Bootstrap(五)

在上一篇<<旺財速啃H5框架之Bootstrap&#xff08;四&#xff09;>>做了基本的框架&#xff0c;<<旺財速啃H5框架之Bootstrap&#xff08;二&#xff09;>>篇里也大體認識了bootstrap.css樣式&#xff0c;下面我們來學習常見的CSS操控內容篇幅。。。。…

【專升本計算機】最新甘肅省專升本考試C語言部分復習題帶答案

最新甘肅省專升本考試C語言部分復習題帶答案 考點1.1-1.2 1、 C 語言源程序文件經過 C 編譯器編譯之后生成一個后綴為( )的文件 A. .c B. .obj C. .exe D. .bas 2、 C 語言源程序文件經過 C 編譯器連接之后生成一個后綴為( )的文件 A. .c B. .obj C. .exe D. .bas 3、完成 …

浮點數一些設計原理

摘要&#xff1a;本篇文章會講述浮點數的設計原理&#xff0c;比如如何存儲二進制的問題&#xff0c;從而幫助我們更好的編碼。 __1. deading code __ console.log(1.0-0.9 0.1); //輸出 false console.log(1.0-0.9, 0.1); //輸出 0.09999999999999998 0.1 //所以判斷浮點運算…

Atitit. http 代理原理 ?atiHttpProxy ?大木馬

Atitit. http 代理原理 atiHttpProxy 大木馬 1. 面這張圖可以清晰地闡明HttpProxy的實現原理&#xff1a;1 2. 代理服務器用途1 3. 其中流程具體如下&#xff1a;2 4. 設計規劃3 5. 結束語4 1. 面這張圖可以清晰地闡明HttpProxy的實現原理&#xff1a; 2. 代理服務器用途 代…

[轉]一文揭秘阿里、騰訊、百度的薪資職級

上周&#xff0c;阿里巴巴董事長兼CEO逍遙子發布內部郵件&#xff0c;宣布了阿里巴巴新一輪組織部晉升名單&#xff0c;涉及所有晉升到P10、P11、P12的高P的人員。其中晉升到M7/ P12的高級管理者包括&#xff1a;淘寶、天貓、阿里媽媽事業群總裁蔣凡、阿里本地生活服務公司CEO王…

C語言試題188之實現strcspn函數功能

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 實現st…

【ArcGIS微課1000例】0014:ArcGIS中如何將kml(kmz)文件轉shp,并進行投影轉換?

KML(Keyhole Markup Language,Keyhole 標記語言)最初是由Google 旗下的Keyhole 公司開發和維護的一種基于XML 的標記語言,利用XML 語法格式描述地理空間數據(如點、線、面、多邊形和模型等),適合網絡環境下的地理信息協作與共享。2008 年4月,KML的最新版本2.2 被OGC 宣布為開…

寫一鍵部署bash腳本

因為我開源的一鍵部署應用到linux服務器的AntDeploy&#xff0c; 在linux部署是需要安裝一個agent服務(systemctl服務)如果是手動第一次安裝的話 需要敲下載 wget解壓 tar修改配置文件的token復制到指定安裝目錄設置權限設置systemd設置systemctl清除臨時文件至少這8中類型的命…

UITableView的使用及代理方法

在App開放中我們經常會使用到UITabbleView&#xff0c;常用于數據展示。那么使用時不得不引入兩個代理方法<UITableViewDataSource,UITableViewDelegate>。 下面我們來簡單的創建一個TableView并介紹下其基本屬性。 property (nonatomic,strong) UITableView * myTable; …

Java集合和泛型練習及面試題——博客園:師妹開講啦

給定一段JAVA代碼如下&#xff1a;要打印出list中存儲的內容&#xff0c;以下語句正確的是&#xff08; B &#xff09; ArrayList list new ArrayList( ) list.add(“a”) list.add(“b”) Iterator it list.iterator( ) A.while(it. Next( ) )   system.out.prin…