From 09352ac5eac55978e0b029d7365bbe0d030f977a Mon Sep 17 00:00:00 2001 From: nsnail Date: Fri, 16 Dec 2022 23:11:06 +0800 Subject: [PATCH] + Unicode,UnicodeDe --- src/Extensions/ByteExtensions.cs | 21 ++++-- src/Extensions/StringExtensions.cs | 100 +++++++++++++++++------------ src/NSExt.csproj | 8 +-- 3 files changed, 76 insertions(+), 53 deletions(-) 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 = "&#x$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