diff --git a/src/Extensions/ByteExtensions.cs b/src/Extensions/ByteExtensions.cs
index b443098..0252e34 100644
--- a/src/Extensions/ByteExtensions.cs
+++ b/src/Extensions/ByteExtensions.cs
@@ -12,7 +12,6 @@ public static class ByteExtensions
return Convert.ToBase64String(me);
}
-
///
/// 将字节数组解码成字符串
///
@@ -24,7 +23,6 @@ public static class ByteExtensions
return e.GetString(me);
}
-
///
/// 将字节数组解码成字符串
///
@@ -41,12 +39,21 @@ public static class ByteExtensions
///
/// 是否大写
/// 字节间分隔符
+ /// 分隔符跳跃字节数
///
- public static string String(this byte[] me, bool upperCase = true, string splitShar = null)
+ public static string String(this IEnumerable me, bool upperCase = true, string splitShar = ""
+ , int splitInterval = 1)
{
- var ret = BitConverter.ToString(me);
- if (!upperCase) ret = ret.ToLower();
- if (splitShar != "-") ret = ret.Replace("-", splitShar ?? string.Empty);
- return ret;
+ var sb = new StringBuilder();
+ var i = 0;
+ foreach (var c in me.Select(x => x.ToString(upperCase ? "X2" : "x2"))) {
+ if (i++ % splitInterval == 0) {
+ sb.Append(splitShar);
+ }
+
+ sb.Append(c);
+ }
+
+ return sb.ToString();
}
}
\ No newline at end of file
diff --git a/src/Extensions/StringExtensions.cs b/src/Extensions/StringExtensions.cs
index c0ef106..2d9e899 100644
--- a/src/Extensions/StringExtensions.cs
+++ b/src/Extensions/StringExtensions.cs
@@ -1,31 +1,15 @@
// ReSharper disable UnusedMember.Global
-
using System.Security.Cryptography;
using System.Text.Json;
namespace NSExt.Extensions;
-public static class StringExtensions
+public static partial class StringExtensions
{
private static readonly JsonSerializerOptions _defaultJsonSerializerOptions
= default(JsonSerializerOptions).NewJsonSerializerOptions();
- ///
- /// MD5 hmac编码
- ///
- /// 字符串
- /// 密钥
- /// 字符串使用的编码
- /// hash摘要的16进制文本形式(无连字符小写)
- private static string Md5Hmac(this string me, string key, Encoding e)
- {
- using var md5Hmac = new HMACMD5(e.GetBytes(key));
- return BitConverter.ToString(md5Hmac.ComputeHash(e.GetBytes(me)))
- .Replace("-", string.Empty)
- .ToLower(CultureInfo.CurrentCulture);
- }
-
///
/// aes加密
///
@@ -47,7 +31,6 @@ public static class StringExtensions
return decrypted.Base64();
}
-
///
/// aes解密
///
@@ -98,7 +81,7 @@ public static class StringExtensions
/// 解码后的原始字符串
public static string Base64De(this string me, Encoding e)
{
- return e.GetString(Base64De(me));
+ return e.GetString(me.Base64De());
}
///
@@ -156,7 +139,6 @@ public static class StringExtensions
: ret;
}
-
///
/// 将字符串转换成日期对象
///
@@ -178,7 +160,6 @@ public static class StringExtensions
return decimal.Parse(me, CultureInfo.CurrentCulture);
}
-
///
/// 尝试将字符串转为decimal
///
@@ -190,7 +171,6 @@ public static class StringExtensions
return !decimal.TryParse(me, out var ret) ? def : ret;
}
-
///
/// string to double
///
@@ -212,7 +192,6 @@ public static class StringExtensions
return (T)System.Enum.Parse(typeof(T), name, true);
}
-
///
/// 将字符串转换成枚举对象
///
@@ -235,7 +214,6 @@ public static class StringExtensions
return float.Parse(me, CultureInfo.CurrentCulture);
}
-
///
/// 将字符串转为guid
///
@@ -257,7 +235,6 @@ public static class StringExtensions
return System.Guid.TryParse(me, out var ret) ? ret : def;
}
-
///
/// 将字符串转换成字节数组形式
///
@@ -268,6 +245,7 @@ public static class StringExtensions
{
return e.GetBytes(me);
}
+ //public static byte[] TextHex(this string me,)
///
/// 将字符串转换成字节数组形式
@@ -279,7 +257,6 @@ public static class StringExtensions
return me.Hex(Encoding.UTF8);
}
-
///
/// 对一个字符串进行sha1 hash运算
///
@@ -337,7 +314,6 @@ public static class StringExtensions
return !int.TryParse(me, out var ret) ? def : ret;
}
-
///
/// string to Int64
///
@@ -369,7 +345,6 @@ public static class StringExtensions
return BitConverter.ToInt32(me.Split('.').Select(byte.Parse).Reverse().ToArray(), 0);
}
-
///
/// 是否base64字符串
///
@@ -380,15 +355,23 @@ public static class StringExtensions
// 一个合法的Base64,有着以下特征:
// 字符串的长度为4的整数倍。
// 字符串的符号取值只能在A -Z, a -z, 0 -9, +, /, =共计65个字符中,且 = 如果出现就必须在结尾出现。
- if (!me.All(x => x.IsBase64Character())) return false;
- if (me.Length % 4 != 0) return false;
+ if (!me.All(x => x.IsBase64Character())) {
+ return false;
+ }
+
+ if (me.Length % 4 != 0) {
+ return false;
+ }
+
var firstEqualSignPos = me.IndexOf('=');
- if (firstEqualSignPos < 0) return true;
+ if (firstEqualSignPos < 0) {
+ return true;
+ }
+
var lastEqualSignPos = me.LastIndexOf('=');
return lastEqualSignPos == me.Length - 1 && me[firstEqualSignPos..lastEqualSignPos].All(x => x == '=');
}
-
///
/// 中文姓名打马赛克
///
@@ -396,7 +379,9 @@ public static class StringExtensions
///
public static string MaskChineseName(this string me)
{
- if (me.Length == 2) return "*" + me[1..];
+ if (me.Length == 2) {
+ return "*" + me[1..];
+ }
return me[..1] + "*" + me[^1..];
}
@@ -411,7 +396,6 @@ public static class StringExtensions
return new Regex(@"^(\d{3})\d{4}(\d{4})$").Replace(me, "$1****$2");
}
-
///
/// 对一个字符串进行md5hash运算
///
@@ -437,7 +421,6 @@ public static class StringExtensions
return me.AsEnumerable().NullOrEmpty() ? defVal : me;
}
-
///
/// null或空白字符
///
@@ -459,7 +442,6 @@ public static class StringExtensions
return JsonSerializer.Deserialize(me, options ?? _defaultJsonSerializerOptions);
}
-
///
/// 反序列化一个文件获得指定类型的数据对象
///
@@ -472,7 +454,6 @@ public static class StringExtensions
return JsonSerializer.Deserialize(me, type, options ?? _defaultJsonSerializerOptions);
}
-
///
/// 生成密码
///
@@ -503,7 +484,6 @@ public static class StringExtensions
return me.Replace("\r", "").Replace("\n", "");
}
-
///
/// 对一个字符串进行sha1 hash运算
///
@@ -518,7 +498,6 @@ public static class StringExtensions
.ToLower(CultureInfo.CurrentCulture);
}
-
///
/// 蛇形命名
///
@@ -529,7 +508,6 @@ public static class StringExtensions
return Regex.Replace(me, "([A-Z])", "-$1").ToLower().TrimStart('-');
}
-
///
/// 截取指定长度的字符串,代替substring
///
@@ -539,7 +517,10 @@ public static class StringExtensions
///
public static string Sub(this string me, int startIndex, int length)
{
- if (startIndex + length > me.Length) length = me.Length - startIndex;
+ if (startIndex + length > me.Length) {
+ length = me.Length - startIndex;
+ }
+
return me.Substring(startIndex, length);
}
@@ -562,9 +543,23 @@ public static class StringExtensions
{
var ret = me.Replace(" ", " ");
// ReSharper disable once TailRecursiveCall
- return ret == me ? ret : TrimSpaces(ret);
+ return ret == me ? ret : ret.TrimSpaces();
}
+ ///
+ /// 将\ux0000 、 %u0000 、 编码转换成可读字符串
+ ///
+ ///
+ ///
+ public static string UnicodeDe(this string me)
+ {
+ const string replacement = "$1;";
+ if (me.Contains(@"\u")) {
+ return RegexBacksLantUnicode().Replace(me, replacement).HtmlDe();
+ }
+
+ return me.Contains(@"%u") ? RegexPercentUnicode().Replace(me, replacement).HtmlDe() : me.HtmlDe();
+ }
///
/// url编码
@@ -585,4 +580,25 @@ public static class StringExtensions
{
return Uri.UnescapeDataString(me);
}
+
+ ///
+ /// MD5 hmac编码
+ ///
+ /// 字符串
+ /// 密钥
+ /// 字符串使用的编码
+ /// hash摘要的16进制文本形式(无连字符小写)
+ private static string Md5Hmac(this string me, string key, Encoding e)
+ {
+ using var md5Hmac = new HMACMD5(e.GetBytes(key));
+ return BitConverter.ToString(md5Hmac.ComputeHash(e.GetBytes(me)))
+ .Replace("-", string.Empty)
+ .ToLower(CultureInfo.CurrentCulture);
+ }
+
+ [GeneratedRegex("\\\\u([a-fA-F0-9]{4})")]
+ private static partial Regex RegexBacksLantUnicode();
+
+ [GeneratedRegex("\\\\u([a-fA-F0-9]{4})")]
+ private static partial Regex RegexPercentUnicode();
}
\ No newline at end of file
diff --git a/src/NSExt.csproj b/src/NSExt.csproj
index 010dd8d..88315e6 100644
--- a/src/NSExt.csproj
+++ b/src/NSExt.csproj
@@ -1,14 +1,14 @@
- net6.0;net7.0
+ net7.0
-
+
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive