介绍 DotNet 库 - Viyi.Strings

Viyi.Strings 是一个 .NET 库,支持 .Net Standard 2.0 和 .Net 5。从名字就能看出来,这个库的主要目的是解决对字符串和文本的一些操作。总的来说,Viyi.Strings 目前的版本提供了如下一些功能:

  • 基于文本的编/解码,支持 Base64 和 Hex(十六进制)编/解码,但不止于此;
  • 提供扩展方法对空字符串和空白字符串进行快速处理;
  • 提供字符串大小写转换框架,并默认提供了 camelCase、PascalCase、kebab-case 和 snake_case 转换方法;
  • 在整数和字符串之间进行 2~36 进制转换,即便只想用 16 进制,也会很方便;
  • 扩展对布尔值的解析,允许 on/offyes/no,允许灵活地自定义转换;
  • 若有其他需求,欢迎在 Issue 中提出并讨论
如何安装?

Viyi.Strings 库已经发布到 NuGet,可以从 NuGet 快速安装。

基于文本的编/解码框架

Viyi.String 库的 Viyi.Strings.Codec命名空间下提供了基于文本的编/解码框架。该命名空间下,不仅提供了 Base64 和 Hex 等常用编/解码方式,还提供了统一的编/解码接口设计,为在某些场景下统一替换编/解码方式提供便利。除此之外,该命名空间下还提供了便于使用的扩展方法。

快速 Base64/Hex 编/解码

Viyi.Stings.Codec.Base64 命名空间对 byte[] 提供了 EncodeBase64()DeocdeBase64() 系列扩展方法,可以迅速地在 byte[] 和 Base64 字符串之间进行编解码转换:

// 随机产生 20 字节数据
byte[] data = new byte[20];
Random r = new Random();
r.NextBytes(data);

string base64;
Console.WriteLine("不加参数:");
Console.WriteLine(base64 = data.EncodeBase64());
// 输出:RdFVrmsY45kkFKkUULem1LfCP6Y=

Compare(data, base64.DecodeBase64());  // 完全匹配

Console.WriteLine("指定行宽为 16:");
Console.WriteLine(base64 = data.EncodeBase64(16));
// 输出:RdFVrmsY45kkFKkU
// 输出:ULem1LfCP6Y=

Compare(data, base64.DecodeBase64());  // 完全匹配

甚至,如果 Base64 缺少最后的 = 号也是可以解码成功的,因为 = 号本来就是表示的空数据。

Console.WriteLine(base64 = data.EncodeBase64());
Compare(data, base64.DecodeBase64());  // 完全匹配

// 根据上面示例,base64 最后一个字符是 = 号,去掉之后再解码
Compare(data, base64.Substring(0, base64.Length - 1).DecodeBase64()); // 完全匹配

上面演示了 Base64 通过扩展方法快速进行编/解码。按 Hex(十六进制)编解码也类似,只是需要使用 Viyi.Strings.Codec.Hex 命名空间。

完整的 Base64/Hex 编/解码

扩展方法只是为 byte[]string 类型分别提供了快捷的编/解码方式。如果需要复杂一点的编/解码,比如对 Stream 进行编/解码,可以使用 EncoderDecoder。通过 Viyi.String.Codec.TextCodec 类可以拿到预置的 Base64CodecHexCodec 对象,他们都实现了 ITextCodec 接口,可以

  • 使用 CreateEncoder() 创建对应的编码器对象,用于对字节数据进行编码
  • 使用 CreateDecoder() 创建对应的解码器对象,用于对字符串数据进行解码

比如,想对将二进制文件 data.bin 中的数据转换成十六进制输出到 data_hexdump.txt 中,可以用这样的代码完成:

var hexEncoder = TextCodec.Hex.CreateEncoder(
    // 选项属性只读,需要使用建造者模式来构建
    CodecOptions.Create()
        // 配置换行:每行 16 字节,也就是 32 个十六进制字符
        .SetLineWidth(16 * 2)
        .Build()
);

using Stream inStream = File.OpenRead("data.bin");
using StreamWriter writer = new StreamWriter("data_hexdump.txt");
hexEncoder.Encode(writer, inStream);

如果编码结果不想写入文件,而是保存在字符串中,使用使用 StringWriter 作为输出,也可以使用 Encode 的另一个重载:

string hex = hexEncoder.Encode(inStream);

更多关于编/解码的内容,可以阅读:文本编码和解码 (Viyi.Strings.Codec))

命名风格(大小写)转换

在多端、多语言、多技术联合实现应用软件/服务的大环境下,想要保持各部分遵从各自的语法和数据规范,对命名进行不同的风格转换就很有必要,也很常用。

Viyi.Strings 在 Viyi.Strings.CaseConverters 命名空间中提供了对命名风格转换在框架地,并默认提供了 camelCase、PascalCase、kebab-case 和 snake_case 的转换工具。这些工具类都实现了 ICaseConverter 接口,方便必要时进行快速选择或替换。

同时,在 Viyi.Strings 命名空间中,也提供了对 string 的扩展方法进行处理调用。比如:

Console.WriteLine("Hello James Fan".KebabCase());
// 输出:hello-james-fan

如果需要了解更多相关内容,可以阅读:命名风格转换 CaseConvert

空字符串和空白字符串

这部分功能主要是扩展 string 在处理空字符串 "" 和空白字符串(仅含空白字符的字符串)的能力。

举例来说,我们知道如果某字符串是 null 就把它变成默认的 "default_value" 可以这么写:

s = s ?? "default_value";
// 或者 s ??= "default_value";

但是,如果想判断某字符串是空字符串时进行替换,不使用 Viyi.Strgins 扩展的情况下需要这样写:

// 如果是 null 或空字符串则替换为默认内容
s = string.IsNullOrEmpty(s) ? "default_value" : s;

// 如果仅空白字符串替换为默认内容,null 不变
s = string.IsNullOrWhiteSpace(s) ? "" : s;

但使用扩展就方便多了:

// 如果是 null 或空字符串则替换为默认内容
s = s.EmptyAs("default_value");

// 如果仅空白字符串替换为默认内容,null 和 "" 不变
s = s?.SpacesAs("");

不需要使用三目运算符,在复杂表达式中使用更简洁。

另外,还提供了 IsEmpty(this string, true)IsSpaces(this string, true) 用于精确判断字符串仅为空字符串空白字符串(精确表示 null 算在内)。

更多详情,请阅读:空字符串和空白字符串

解析布尔值

.Net 默认的布尔解析只能处理 "true""false",但实际使用中,像 on/offyes/no 等也是可以转换为布尔类型数据的。Viyi.Strings 提供了多个 ToBoolean() 重载来实现各种各样的需求,比如

// 如果 s 是 true,返回 true;s 是 false 返回 false;否则返回 null。
s.ToBoolean(true);

// 与第 1 个参数匹配返回 true;与第 2 个参数匹配返回 false;否则返回 null。
s.ToBoolean("yes", "no");

// 在第一个数组中返回 true;在第 2 个数组中返回 false;其它情况返回 null。
s.ToBoolean(new String[] { "yes", "on" }, new String[] { "no", "off" });

// 与第一个参数之后的任意参数匹配,返回第一参数的表示的布尔值,否则返回相反值
s.ToBoolean(false, "no", "off", "false", "down");

更多内容请阅读:解析为布尔类型 (bool))

整数的进制转换

Viyi.StringsViyi.Strings.Extensions 命名空间中提供了 2~32 进制的转换工具函数,可以在字符串和 intuintlongulong 之间进行进制转换。比如

"3ae".ToInt32(16); // 942
"3ae".ToInt32(16).ToString(8); // 1656
(36 + 35).ToString(36); // 1z

更新内容请阅读:整数的进制转换

结语

对 Viyi.Strings 的介绍就到这里,欢迎有兴趣的朋友参与到这个开源工具库来!

源码托管在 Gitee 上:边城/Viyi.String


边城客栈
全栈技术专栏,公众号「边城客栈」,[链接]

一路从后端走来,终于走在了前端!

56.2k 声望
26.5k 粉丝
0 条评论
推荐阅读
2022,二着二着又混过一年
收到思否小姐姐的活动提醒,才发觉又到了年底,该写“总结”了。说起总结,总有些倦——每天工作要写日报、项目上要写周报、月底要写月报、季度还有季总结,当然还有半年总结和年终总结……一年大约是 250 个工作日、50...

边城6阅读 784评论 2

封面图
使用 .NET 7、Blazor 和 .NET MAUI 构建你自己的 Podcast App
.NET Podcast App 首次在 .NET Conf 2021上推出,最近进行了更新以在 .NET Conf 2022 keynote 中突出显示 .NET 7 中的新功能。该 Podcast App 已准备好使用展示 .NET,ASP.NET Core,Blazor,.NET MAUI,Azure Co...

微软技术栈阅读 682

封面图
官方盘点 .NET 7 新功能
.NET 7 为C# 11/F# 7、.NET MAUI、ASP.NET Core/Blazor、Web API、WinForms、WPF 等应用程序带来了更高的性能和新功能。使用 .NET 7,您还可以轻松地将 .NET 7 项目容器化,在 GitHub 操作中设置 CI/CD 工作流,...

微软技术栈阅读 609

封面图
MASA Stack 1.0 发布会 倒计时一天
​扫描二维码,预约直播2023/1/16 14:00 与你不见不散发布会精彩看点抢先看MASA Stack 1.0 趋势篇世界技术圈在发什么?应用现代化宣布MASA Stack1.0版本正式发布MASA Stack 1.0 产品篇1.0产品架构介绍一站式现代化...

MASA技术团队阅读 483

通过 .NET 完成机器学习的整个流程,这个平台可以!
.NET 是⼀个跨平台,全场景应用的开源技术。你有在用 .NET 做机器学习/深度学习的应用吗?如果从框架角度,ML.NET/Tensorflow.NET/不断在进步的 TorchSharp 通过几年的发展已经开始稳定,但如果在⼀些⼤型项目上...

微软技术栈阅读 463

封面图
.NET 7.0 新版本发布特别企划 | 二十周年感恩预热
各位 DOTNET 粉丝们过节比特熊故事汇2.0 DOTNET 专场一次性联动圈内三位资深专家逐一解锁版本升级、经验故事、社区峰会亮点2022年11月23日19:00-20:00【比特熊故事汇2.0】.NET 开发者感恩节超前共度

微软技术栈阅读 424

封面图
[oeasy]python0015_十六进制_hexadecimal_字节形态_hex函数
十六进制(hexadecimal)回忆上次内容上次数制可以转化bin(n)可以把数字转化为 2进制binary接收一个整数(int)得到一个二进制数形式的字符串数字在计算机中是用二进制存储的但是展示给我们的时候用的是十进制也就是0...

oeasy阅读 414

一路从后端走来,终于走在了前端!

56.2k 声望
26.5k 粉丝
宣传栏