Init
This commit is contained in:
91
ConsoleApp2/Helpers/DumpDataHelper.cs
Normal file
91
ConsoleApp2/Helpers/DumpDataHelper.cs
Normal file
@@ -0,0 +1,91 @@
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace ConsoleApp2.Helpers;
|
||||
|
||||
public static partial class DumpDataHelper
|
||||
{
|
||||
[GeneratedRegex(@"'.+\.dat'")]
|
||||
private static partial Regex MatchDatFile();
|
||||
[GeneratedRegex(@"\([^)]*\)")]
|
||||
private static partial Regex MatchBrackets();
|
||||
|
||||
|
||||
public static async Task<string[]> GetCsvHeadersFromSqlFileAsync(string filePath)
|
||||
{
|
||||
var txt = await File.ReadAllTextAsync(filePath);
|
||||
var match = MatchBrackets().Match(txt);
|
||||
|
||||
return ParseHeader(match.ValueSpan);
|
||||
}
|
||||
|
||||
private static string[] ParseHeader(ReadOnlySpan<char> headerStr)
|
||||
{
|
||||
headerStr = headerStr[1..^1];
|
||||
Span<Range> ranges = stackalloc Range[50];
|
||||
var count = headerStr.Split(ranges, ',');
|
||||
var arr = new string[count];
|
||||
|
||||
for (var i = 0; i < count; i++)
|
||||
{
|
||||
arr[i] = headerStr[ranges[i]].Trim("@`").ToString(); // 消除列名的反引号,如果是变量则消除@
|
||||
}
|
||||
|
||||
return arr;
|
||||
}
|
||||
|
||||
|
||||
public static string GetTableName(ReadOnlySpan<char> filePath)
|
||||
{
|
||||
filePath = filePath[(filePath.LastIndexOf('\\') + 1)..];
|
||||
var firstDotIdx = -1;
|
||||
var secondDotIdx = -1;
|
||||
var times = 0;
|
||||
for (var i = 0; i < filePath.Length; i++)
|
||||
{
|
||||
if (filePath[i] == '.')
|
||||
{
|
||||
++times;
|
||||
if(times == 1)
|
||||
firstDotIdx = i;
|
||||
if (times == 2)
|
||||
{
|
||||
secondDotIdx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return filePath[(firstDotIdx+1)..secondDotIdx].ToString();
|
||||
}
|
||||
|
||||
public static async Task<string[]> GetCsvFileNamesFromSqlFileAsync(string filePath)
|
||||
{
|
||||
var txt = await File.ReadAllTextAsync(filePath);
|
||||
var matches = MatchDatFile().Matches(txt);
|
||||
return matches.Select(match => match.ValueSpan[1..^1].ToString()).ToArray();
|
||||
}
|
||||
|
||||
public static bool CheckHexField(string? str)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(str))
|
||||
return false;
|
||||
|
||||
if (str.StartsWith('\"'))
|
||||
return false;
|
||||
|
||||
var isDigit = true;
|
||||
|
||||
foreach (var c in str)
|
||||
{
|
||||
if (!char.IsAsciiHexDigit(c))
|
||||
return false;
|
||||
if (!char.IsNumber(c))
|
||||
isDigit = false;
|
||||
}
|
||||
|
||||
if (isDigit)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
30
ConsoleApp2/Helpers/Extensions.Dictionary.cs
Normal file
30
ConsoleApp2/Helpers/Extensions.Dictionary.cs
Normal file
@@ -0,0 +1,30 @@
|
||||
namespace ConsoleApp2.Helpers;
|
||||
|
||||
public static class DictionaryExtensions
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 根据指定的键是否存在来添加或是更新字典
|
||||
/// </summary>
|
||||
/// <param name="this"></param>
|
||||
/// <param name="key">指定的键</param>
|
||||
/// <param name="addValue">如果指定的键不存在,则向字典添加该值</param>
|
||||
/// <param name="updateFactory">如果指定的键存在,则根据该委托的返回值修改字典中对应的值</param>
|
||||
/// <typeparam name="TKey"></typeparam>
|
||||
/// <typeparam name="TValue"></typeparam>
|
||||
/// <returns>添加或是修改后的值</returns>
|
||||
public static TValue AddOrUpdate<TKey, TValue>(this IDictionary<TKey, TValue> @this, TKey key, TValue addValue,
|
||||
Func<TKey, TValue, TValue> updateFactory)
|
||||
{
|
||||
if (!@this.TryGetValue(key, out var value))
|
||||
{
|
||||
@this.Add(key, addValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
@this[key] = updateFactory(key, value);
|
||||
}
|
||||
|
||||
return @this[key];
|
||||
}
|
||||
}
|
47
ConsoleApp2/Helpers/Extensions.String.cs
Normal file
47
ConsoleApp2/Helpers/Extensions.String.cs
Normal file
@@ -0,0 +1,47 @@
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
|
||||
namespace ConsoleApp2.Helpers;
|
||||
|
||||
public static class StringExtensions
|
||||
{
|
||||
public static string Omit(this ReadOnlySpan<char> @this, int maxLength)
|
||||
{
|
||||
if (@this.Length > maxLength)
|
||||
return @this[..maxLength].ToString() + "...";
|
||||
return @this.ToString();
|
||||
}
|
||||
|
||||
public static string Omit(this string @this, int maxLength) => Omit(@this.AsSpan(), maxLength);
|
||||
|
||||
public static string FromHex(ReadOnlySpan<char> hexString, Encoding? encoding = null)
|
||||
{
|
||||
encoding ??= Encoding.UTF8;
|
||||
|
||||
var realLength = 0;
|
||||
for (var i = hexString.Length - 2; i >= 0; i -= 2)
|
||||
{
|
||||
var b = byte.Parse(hexString.Slice(i, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
|
||||
if (b != 0) //not NULL character
|
||||
{
|
||||
realLength = i + 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var bytes = new byte[realLength / 2];
|
||||
for (var i = 0; i < bytes.Length; i++)
|
||||
{
|
||||
bytes[i] = byte.Parse(hexString.Slice(i * 2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
return encoding.GetString(bytes);
|
||||
}
|
||||
|
||||
public static bool CheckJsonHex(ReadOnlySpan<char> hexStr)
|
||||
{
|
||||
if (hexStr.Length < 2)
|
||||
return false;
|
||||
return FromHex(hexStr[..2]) is ['{'] or ['['];
|
||||
}
|
||||
}
|
249
ConsoleApp2/Helpers/HashExtension.cs
Normal file
249
ConsoleApp2/Helpers/HashExtension.cs
Normal file
@@ -0,0 +1,249 @@
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
|
||||
namespace ConsoleApp2.Helpers;
|
||||
|
||||
public static class HashExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// 计算32位MD5码
|
||||
/// </summary>
|
||||
/// <param name="word">字符串</param>
|
||||
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
|
||||
/// <returns></returns>
|
||||
public static string ToMd5Hash(this string word, bool toUpper = true)
|
||||
{
|
||||
try
|
||||
{
|
||||
var MD5CSP = MD5.Create();
|
||||
var bytValue = Encoding.UTF8.GetBytes(word);
|
||||
var bytHash = MD5CSP.ComputeHash(bytValue);
|
||||
MD5CSP.Clear();
|
||||
//根据计算得到的Hash码翻译为MD5码
|
||||
var sHash = "";
|
||||
foreach (var t in bytHash)
|
||||
{
|
||||
long i = t / 16;
|
||||
var sTemp = i > 9 ? ((char)(i - 10 + 0x41)).ToString() : ((char)(i + 0x30)).ToString();
|
||||
i = t % 16;
|
||||
if (i > 9)
|
||||
{
|
||||
sTemp += ((char)(i - 10 + 0x41)).ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
sTemp += ((char)(i + 0x30)).ToString();
|
||||
}
|
||||
|
||||
sHash += sTemp;
|
||||
}
|
||||
|
||||
//根据大小写规则决定返回的字符串
|
||||
return toUpper ? sHash : sHash.ToLower();
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
throw new System.Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
public static string ToMd5Hash(this Stream stream, bool toUpper = true)
|
||||
{
|
||||
using var md5Hash = MD5.Create();
|
||||
var bytes = md5Hash.ComputeHash(stream);
|
||||
return ToHashString(bytes, toUpper);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算SHA-1码
|
||||
/// </summary>
|
||||
/// <param name="word">字符串</param>
|
||||
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
|
||||
/// <returns></returns>
|
||||
public static string ToSHA1Hash(this string word, bool toUpper = true)
|
||||
{
|
||||
try
|
||||
{
|
||||
var SHA1CSP = SHA1.Create();
|
||||
var bytValue = Encoding.UTF8.GetBytes(word);
|
||||
var bytHash = SHA1CSP.ComputeHash(bytValue);
|
||||
SHA1CSP.Clear();
|
||||
//根据计算得到的Hash码翻译为SHA-1码
|
||||
var sHash = "";
|
||||
foreach (var t in bytHash)
|
||||
{
|
||||
long i = t / 16;
|
||||
var sTemp = i > 9 ? ((char)(i - 10 + 0x41)).ToString() : ((char)(i + 0x30)).ToString();
|
||||
i = t % 16;
|
||||
if (i > 9)
|
||||
{
|
||||
sTemp += ((char)(i - 10 + 0x41)).ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
sTemp += ((char)(i + 0x30)).ToString();
|
||||
}
|
||||
|
||||
sHash += sTemp;
|
||||
}
|
||||
|
||||
//根据大小写规则决定返回的字符串
|
||||
return toUpper ? sHash : sHash.ToLower();
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
throw new System.Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算SHA-256码
|
||||
/// </summary>
|
||||
/// <param name="word">字符串</param>
|
||||
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
|
||||
/// <returns></returns>
|
||||
public static string ToSHA256Hash(this string word, bool toUpper = true)
|
||||
{
|
||||
try
|
||||
{
|
||||
var SHA256CSP = SHA256.Create();
|
||||
var bytValue = Encoding.UTF8.GetBytes(word);
|
||||
var bytHash = SHA256CSP.ComputeHash(bytValue);
|
||||
SHA256CSP.Clear();
|
||||
//根据计算得到的Hash码翻译为SHA-1码
|
||||
var sHash = "";
|
||||
foreach (var t in bytHash)
|
||||
{
|
||||
long i = t / 16;
|
||||
var sTemp = i > 9 ? ((char)(i - 10 + 0x41)).ToString() : ((char)(i + 0x30)).ToString();
|
||||
i = t % 16;
|
||||
if (i > 9)
|
||||
{
|
||||
sTemp += ((char)(i - 10 + 0x41)).ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
sTemp += ((char)(i + 0x30)).ToString();
|
||||
}
|
||||
|
||||
sHash += sTemp;
|
||||
}
|
||||
|
||||
//根据大小写规则决定返回的字符串
|
||||
return toUpper ? sHash : sHash.ToLower();
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
throw new System.Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算SHA-256码
|
||||
/// </summary>
|
||||
/// <param name="stream"></param>
|
||||
/// <param name="toUpper"></param>
|
||||
/// <returns></returns>
|
||||
public static string ToSHA256Hash(this Stream stream, bool toUpper = true)
|
||||
{
|
||||
using var sha256Hash = SHA256.Create();
|
||||
var bytes = sha256Hash.ComputeHash(stream);
|
||||
return ToHashString(bytes, toUpper);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算SHA-384码
|
||||
/// </summary>
|
||||
/// <param name="word">字符串</param>
|
||||
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
|
||||
/// <returns></returns>
|
||||
public static string ToSHA384Hash(this string word, bool toUpper = true)
|
||||
{
|
||||
try
|
||||
{
|
||||
var SHA384CSP = SHA384.Create();
|
||||
var bytValue = Encoding.UTF8.GetBytes(word);
|
||||
var bytHash = SHA384CSP.ComputeHash(bytValue);
|
||||
SHA384CSP.Clear();
|
||||
//根据计算得到的Hash码翻译为SHA-1码
|
||||
var sHash = "";
|
||||
foreach (var t in bytHash)
|
||||
{
|
||||
long i = t / 16;
|
||||
var sTemp = i > 9 ? ((char)(i - 10 + 0x41)).ToString() : ((char)(i + 0x30)).ToString();
|
||||
i = t % 16;
|
||||
if (i > 9)
|
||||
{
|
||||
sTemp += ((char)(i - 10 + 0x41)).ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
sTemp += ((char)(i + 0x30)).ToString();
|
||||
}
|
||||
|
||||
sHash += sTemp;
|
||||
}
|
||||
|
||||
//根据大小写规则决定返回的字符串
|
||||
return toUpper ? sHash : sHash.ToLower();
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
throw new System.Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算SHA-512码
|
||||
/// </summary>
|
||||
/// <param name="word">字符串</param>
|
||||
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
|
||||
/// <returns></returns>
|
||||
public static string ToSHA512Hash(this string word, bool toUpper = true)
|
||||
{
|
||||
try
|
||||
{
|
||||
var SHA512CSP = SHA512.Create();
|
||||
var bytValue = Encoding.UTF8.GetBytes(word);
|
||||
var bytHash = SHA512CSP.ComputeHash(bytValue);
|
||||
SHA512CSP.Clear();
|
||||
//根据计算得到的Hash码翻译为SHA-1码
|
||||
var sHash = "";
|
||||
foreach (var t in bytHash)
|
||||
{
|
||||
long i = t / 16;
|
||||
var sTemp = i > 9 ? ((char)(i - 10 + 0x41)).ToString() : ((char)(i + 0x30)).ToString();
|
||||
i = t % 16;
|
||||
if (i > 9)
|
||||
{
|
||||
sTemp += ((char)(i - 10 + 0x41)).ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
sTemp += ((char)(i + 0x30)).ToString();
|
||||
}
|
||||
|
||||
sHash += sTemp;
|
||||
}
|
||||
|
||||
//根据大小写规则决定返回的字符串
|
||||
return toUpper ? sHash : sHash.ToLower();
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
throw new System.Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
private static string ToHashString(byte[] bytes, bool toUpper = true)
|
||||
{
|
||||
var builder = new StringBuilder();
|
||||
foreach (var t in bytes)
|
||||
{
|
||||
builder.Append(t.ToString("x2"));
|
||||
}
|
||||
|
||||
var str = builder.ToString();
|
||||
return toUpper ? str.ToUpper() : str.ToLower();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user