使用 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.mzph.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…