乐趣区

关于.net:介绍-DotNet-库-ViyiStrings

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

退出移动版