Masuit.Tools(碼數吐司庫)
新手友好的C#萬能工具庫,包含一些常用的操作類,大都是靜态類,加密解密,反射操作,權重随機篩選算法,分布式短id,表達式樹,linq擴充,檔案壓縮,多線程下載下傳和FTP用戶端,硬體資訊,字元串擴充方法,日期時間擴充操作,中國農曆,大檔案拷貝,圖像裁剪,驗證碼,斷點續傳,集合擴充、Excel導出等常用封裝。
功能
請注意:
一旦使用本開源項目以及引用了本項目或包含本項目代碼的公司因為違反勞動法(包括但不限定非法裁員、逾時用工、雇傭童工等)在任何法律訴訟中敗訴的,一經發現,本項目作者有權利追讨本項目的使用費(公司工商注冊資訊認繳金額的2-5倍作為本項目的授權費),或者直接不允許使用任何包含本項目的源代碼!任何性質的
外包公司
或
996公司
需要使用本類庫,請聯系作者進行商業授權!其他企業或個人可随意使用不受限。996那叫用人,也是廢人。8小時工作制才可以讓你有時間自我提升,将來有競争力。反對996,人人有責!
安裝程式包
PM> Install-Package Masuit.Tools.Core
特色功能示例代碼
線上體驗
https://replit.com/@ldqk/MasuitToolsDemo?v=1#main.cs
1.檢驗字元串是否是Email、手機号、URL、IP位址、身份證号等
var (isMatch, match) = "[email protected]".MatchEmail(); // 可在appsetting.json中添加EmailDomainWhiteList和EmailDomainBlockList配置郵箱域名黑白名單,逗号分隔,如"EmailDomainBlockList": "^\\w{1,5}@qq.com,^\\w{1,5}@163.com,^\\w{1,5}@gmail.com,^\\w{1,5}@outlook.com",
bool isInetAddress = "114.114.114.114".MatchInetAddress();
bool isUrl = "http://ldqk.org/20/history".MatchUrl();
bool isPhoneNumber = "15205201520".MatchPhoneNumber();
bool isIdentifyCard = "312000199502230660".MatchIdentifyCard();// 校驗中國大陸身份證号
bool isCNPatentNumber = "200410018477.9".MatchCNPatentNumber(); // 校驗中國專利申請号或專利号,是否帶校驗位,校驗位前是否帶“.”,都可以校驗,待校驗的号碼前不要帶CN、ZL字樣的字首
2.硬體監測(僅支援Windows,部分函數僅支援實體機模式)
float load = SystemInfo.CpuLoad;// 擷取CPU占用率
long physicalMemory = SystemInfo.PhysicalMemory;// 擷取實體記憶體總數
long memoryAvailable = SystemInfo.MemoryAvailable;// 擷取實體記憶體可用率
double freePhysicalMemory = SystemInfo.GetFreePhysicalMemory();// 擷取可用實體記憶體
double temperature = SystemInfo.GetCPUTemperature();// 擷取CPU溫度
int cpuCount = SystemInfo.GetCpuCount();// 擷取CPU核心數
var ipAddress = SystemInfo.GetLocalIPs();// 擷取本機所有IP位址
string localUsedIp = SystemInfo.GetLocalUsedIP();// 擷取本機目前正在使用的IP位址
IList<string> macAddress = SystemInfo.GetMacAddress();// 擷取本機所有網卡mac位址
string osVersion = Windows.GetOsVersion();// 擷取作業系統版本
RamInfo ramInfo = SystemInfo.GetRamInfo();// 擷取記憶體資訊
var cpuSN=SystemInfo.GetCpuInfo()[0].SerialNumber; // CPU序列号
var driveSN=SystemInfo.GetDiskInfo()[0].SerialNumber; // 硬碟序列号
// 快速方法
var cpuInfos = CpuInfo.Locals; // 快速擷取CPU的資訊
var ramInfo = RamInfo.Local; // 快速擷取記憶體的資訊
var diskInfos = DiskInfo.Locals; // 快速擷取硬碟的資訊
var biosInfo = BiosInfo.Local; // 快速擷取主機闆的資訊
3.html的防XSS處理:
string html = @"<link href='/Content/font-awesome/css' rel='stylesheet'/>
<!--[if IE 7]>
<link href='/Content/font-awesome-ie7.min.css' rel='stylesheet'/>
<![endif]-->
<script src='/Scripts/modernizr'></script>
<div id='searchBox' role='search'>
<form action='/packages' method='get'>
<span class='user-actions'><a href='/users/account/LogOff'>退出</a></span>
<input name='q' id='searchBoxInput'/>
<input id='searchBoxSubmit' type='submit' value='Submit' />
</form>
</div>";
string s = html.HtmlSanitizerStandard();// 清理後:<div><span><a href="/users/account/LogOff">退出</a></span></div>
string s = html.HtmlSanitizerCustom(); // 自定義清理
4.整理Windows系統的記憶體:
類似于各大系統優化軟體的加速球功能
Windows.ClearMemorySilent();
5.任意進制轉換/中文數字
大寫數字
var num=123.45.ToChineseMoney(); // 壹佰貳拾叁元肆角伍分
var num=123.45.ToChineseNumber(); // 一百二十三點四五
進制轉換
可用于生成短id,短hash,随機字元串等操作,純數學運算。
NumberFormater nf = new NumberFormater(36);//内置2-91進制的轉換
//NumberFormater nf = new NumberFormater("0123456789abcdefghijklmnopqrstuvwxyz");// 自定義進制字元,可用于生成驗證碼,自定義字元可支援任意進制,你傳1w個字元進去那就支援一萬進制(手動狗頭)
string s36 = nf.ToString(12345678);
long num = nf.FromString("7clzi");
Console.WriteLine("12345678的36進制是:" + s36); // 7clzi
Console.WriteLine("36進制的7clzi是:" + num); // 12345678
var s = new NumberFormater(91).ToString(new Random().Next(100000, int.MaxValue)); //配合随機數生成随機字元串
//擴充方法形式調用
var bin=12345678.ToBase(36);// 10進制轉36進制:7clzi
var num="7clzi".FromBase(36);// 36進制轉10進制:12345678
//超大數字的進制轉換
var num = "e6186159d38cd50e0463a55e596336bd".FromBaseBig(16); // 大數字16進制轉10進制
Console.WriteLine(num); // 十進制:305849028665645097422198928560410015421
Console.WriteLine(num.ToBase(64)); // 64進制:3C665pQUPl3whzFlVpoPqZ,22位長度
Console.WriteLine(num.ToBase(36)); // 36進制:dmed4dkd5bhcg4qdktklun0zh,25位長度
Console.WriteLine(num.ToBase(7)); // 7進制:2600240311641665565300424545154525131265221035,46位長度
Console.WriteLine(num.ToBase(12)); // 12進制:5217744842749978a756b22135b16a5998a5,36位長度
Console.WriteLine(num.ToBase(41)); // 41進制:opzeBda2aytcEeudEquuesbk,24位長度
如果你想讓進制符支援emoji,NumberFormater是不支援的,不過如果你确實有這麼騷的需求,我還準備了UnicodeFormater類,用于支援emoji,用法和NumberFormater一模一樣,并且,UnicodeFormater的功能包含NumberFormater的功能,但是,性能比NumberFormater差了許多。
var formater = new UnicodeFormater("😀😁😂🤣😃😄😅😆😉😊😋😎😍😘🥰😗😙🥲😚🙂🤗🤩🤔🤨😑😶😶🌫🙄😏😣😥😮");
var s = formater.ToString(1234567890); // 😄🌫😶😋😋
var num = formater.FromString(s); // 1234567890
6.納秒級性能計時器
HiPerfTimer timer = HiPerfTimer.StartNew();
for (int i = 0; i < 100000; i++)
{
//todo
}
timer.Stop();
Console.WriteLine("執行for循環100000次耗時"+timer.Duration+"s");
double time = HiPerfTimer.Execute(() =>
{
for (int i = 0; i < 100000; i++)
{
//todo
}
});
Console.WriteLine("執行for循環100000次耗時"+time+"s");
7.産生分布式唯一有序短id(雪花id)
var sf = SnowFlake.GetInstance();
string token = sf.GetUniqueId();// rcofqodori0w
string shortId = sf.GetUniqueShortId(8);// qodw9728
var set = new HashSet<string>();
double time = HiPerfTimer.Execute(() =>
{
for (int i = 0; i < 1000000; i++)
{
set.Add(SnowFlake.GetInstance().GetUniqueId());
}
});
Console.WriteLine(set.Count == 1000000); //True
Console.WriteLine("産生100w個id耗時" + time + "s"); //2.6891495s
8.農曆轉換
ChineseCalendar.CustomHolidays.Add(DateTime.Parse("2018-12-31"),"元旦節");//自定義節假日
ChineseCalendar today = new ChineseCalendar(DateTime.Parse("2018-12-31"));
Console.WriteLine(today.ChineseDateString);// 二零一八年十一月廿五
Console.WriteLine(today.AnimalString);// 生肖:狗
Console.WriteLine(today.GanZhiDateString);// 幹支:戊戌年甲子月丁酉日
Console.WriteLine(today.DateHoliday);// 擷取按公曆計算的節假日
...
9.Linq表達式樹擴充
Expression<Func<string, bool>> where1 = s => s.StartsWith("a");
Expression<Func<string, bool>> where2 = s => s.Length > 10;
Func<string, bool> func = where1.And(where2)
.AndIf(!string.IsOrEmpty(name),s=>s==name)
.Compile(); // And和AndIf可供選擇,滿足條件再執行And
bool b=func("abcd12345678");//true
Expression<Func<string, bool>> where1 = s => s.StartsWith("a");
Expression<Func<string, bool>> where2 = s => s.Length > 10;
Func<string, bool> func = where1
.Or(where2)
.OrIf(!string.IsOrEmpty(name),s=>s==name)
.Compile(); // Or和OrIf可供選擇,滿足條件再執行Or
bool b=func("abc");// true
queryable.WhereIf(!string.IsOrEmpty(name),e=>e.Name==name)
.WhereIf(()=> age.HasValue,e=>e.Age>=age); // IQueryable的WhereIf擴充函數,滿足條件再執行Where
10.模版引擎
var tmp = new Template("{{name}},你好!");
tmp.Set("name", "萬金油");
string s = tmp.Render();//萬金油,你好!
var tmp = new Template("{{one}},{{two}},{{three}}");
string s = tmp.Set("one", "1").Set("two", "2").Set("three", "3").Render();// 1,2,3
var tmp = new Template("{{name}},{{greet}}!");
tmp.Set("name", "萬金油");
string s = tmp.Render();// throw 模版變量{{greet}}未被使用
11.List轉Datatable
var list = new List<MyClass>()
{
new MyClass()
{
Name = "張三",
Age = 22
},
new MyClass()
{
Name = "李四",
Age = 21
},
new MyClass()
{
Name = "王五",
Age = 28
}
};
var table = list.Select(c => new{姓名=c.Name,年齡=c.Age}).ToDataTable();// 将自動填充列姓名和年齡
12.檔案壓縮解壓
.NET Framework
MemoryStream ms = SevenZipCompressor.ZipStream(new List<string>()
{
@"D:\1.txt",
"http://ww3.sinaimg.cn/large/87c01ec7gy1fsq6rywto2j20je0d3td0.jpg",
});//壓縮成記憶體流
SevenZipCompressor.Zip(new List<string>()
{
@"D:\1.txt",
"http://ww3.sinaimg.cn/large/87c01ec7gy1fsq6rywto2j20je0d3td0.jpg",
}, zip);//壓縮成zip
SevenZipCompressor.UnRar(@"D:\Download\test.rar", @"D:\Download\");//解壓rar
SevenZipCompressor.Decompress(@"D:\Download\test.tar", @"D:\Download\");//自動識别解壓壓縮包
SevenZipCompressor.Decompress(@"D:\Download\test.7z", @"D:\Download\");
ASP.NET Core
Startup.cs
services.AddSevenZipCompressor();
構造函數注入ISevenZipCompressor
private readonly ISevenZipCompressor _sevenZipCompressor;
public Test(ISevenZipCompressor sevenZipCompressor)
{
_sevenZipCompressor = sevenZipCompressor;
}
使用方式同.NET Framework版本
13.簡易日志元件(又不是不能用.jpg)
LogManager.LogDirectory=AppDomain.CurrentDomain.BaseDirectory+"/logs";
LogManager.Event+=info =>
{
//todo:注冊一些事件操作
};
LogManager.Info("記錄一次消息");
LogManager.Error(new Exception("異常消息"));
14.多線程背景下載下傳
var mtd = new MultiThreadDownloader("https://attachments-cdn.shimo.im/yXwC4kphjVQu06rH/KeyShot_Pro_7.3.37.7z",Environment.GetEnvironmentVariable("temp"),"E:\\Downloads\\KeyShot_Pro_7.3.37.7z",8);
mtd.Configure(req =>
{
req.Referer = "https://masuit.com";
req.Headers.Add("Origin", "https://baidu.com");
});
mtd.TotalProgressChanged+=(sender, e) =>
{
var downloader = sender as MultiThreadDownloader;
Console.WriteLine("下載下傳進度:"+downloader.TotalProgress+"%");
Console.WriteLine("下載下傳速度:"+downloader.TotalSpeedInBytes/1024/1024+"MBps");
};
mtd.FileMergeProgressChanged+=(sender, e) =>
{
Console.WriteLine("下載下傳完成");
};
mtd.FileMergedComplete+=(sender,e)=>{
Console.WriteLine("檔案合并完成");
};
mtd.Start();//開始下載下傳
//mtd.Pause(); // 暫停下載下傳
//mtd.Resume(); // 繼續下載下傳
15.加密解密/hash
var enc="123456".MDString();// MD5
var enc="123456".MDString("abc");// MD5加鹽
var enc="123456".MDString2();// MD5兩次
var enc="123456".MDString2("abc");// MD5兩次加鹽
var enc="123456".MDString3();// MD5三次
var enc="123456".MDString3("abc");// MD5三次加鹽
string aes = "123456".AESEncrypt();// AES加密為密文
string s = aes.AESDecrypt(); //AES解密為明文
string aes = "123456".AESEncrypt("abc");// AES密鑰加密為密文
string s = aes.AESDecrypt("abc"); //AES密鑰解密為明文
string enc = "123456".DesEncrypt();// DES加密為密文
string s = enc.DesDecrypt(); //DES解密為明文
string enc = "123456".DesEncrypt("abcdefgh");// DES密鑰加密為密文
string s = enc.DesDecrypt("abcdefgh"); //DES密鑰解密為明文
RsaKey rsaKey = RsaCrypt.GenerateRsaKeys();// 生成RSA密鑰對
string encrypt = "123456".RSAEncrypt(rsaKey.PublicKey);// 公鑰加密
string s = encrypt.RSADecrypt(rsaKey.PrivateKey);// 私鑰解密
string s = "123".Crc32();// 生成crc32摘要
string s = "123".Crc64();// 生成crc64摘要
string s = "123".SHA256();// 生成SHA256摘要
string pub="hello,world!";
string hidden="ldqk";
var str = pub.InjectZeroWidthString(hidden); // 擴充函數調用:将"ldqk"以零寬字元串的方式隐藏在"hello,world!"中
var str = ZeroWidthCodec.Encrypt(pub,hidden); // 類調用:将"ldqk"以零寬字元串的方式隐藏在"hello,world!"中
var dec = str.DecodeZeroWidthString(); // 擴充函數調用:将包含零寬字元串的密文解密出隐藏字元串"ldqk"
var dec = ZeroWidthCodec.Decrypt(str); // 類調用:将包含零寬字元串的密文解密出隐藏字元串"ldqk"
var enc = hidden.EncodeToZeroWidthText(); // 擴充函數調用:将字元串編碼成零寬字元串
var enc = ZeroWidthCodec.Encode(); // 類調用:将字元串編碼成零寬字元串
16.實體校驗
public class MyClass
{
[IsEmail] //可在appsetting.json中添加EmailDomainWhiteList配置郵箱域名白名單,逗号分隔
public string Email { get; set; }
[IsPhone]
public string PhoneNumber { get; set; }
[IsIPAddress]
public string IP { get; set; }
[MinValue(0, ErrorMessage = "年齡最小為0歲"), MaxValue(100, ErrorMessage = "年齡最大100歲")]
public int Age { get; set; }
[ComplexPassword]//密碼複雜度校驗
public string Password { get; set; }
[EnumOf] // 檢測是否是有效枚舉值
public MyEnum MyEnum { get; set; }
[MinItemsCount(1)] // 檢測集合元素最少1個
public List<string> Strs { get; set; }
}
17.HTML操作
List<string> srcs = "html".MatchImgSrcs().ToList();// 擷取html字元串裡所有的img标簽的src屬性
var imgTags = "html".MatchImgTags();//擷取html字元串裡的所有的img标簽
var str="html".RemoveHtmlTag(); // 去除html标簽
...
18.DateTime擴充
double milliseconds = DateTime.Now.GetTotalMilliseconds();// 擷取毫秒級時間戳
double microseconds = DateTime.Now.GetTotalMicroseconds();// 擷取微秒級時間戳
double nanoseconds = DateTime.Now.GetTotalNanoseconds();// 擷取納秒級時間戳
double seconds = DateTime.Now.GetTotalSeconds();// 擷取秒級時間戳
double minutes = DateTime.Now.GetTotalMinutes();// 擷取分鐘級時間戳
...
19.IP位址和URL
bool inRange = "192.168.2.2".IpAddressInRange("192.168.1.1","192.168.3.255");// 判斷IP位址是否在這個位址段裡
bool isPrivateIp = "172.16.23.25".IsPrivateIP();// 判斷是否是私有位址
bool isExternalAddress = "http://baidu.com".IsExternalAddress();// 判斷是否是外網的URL
//以下需要配置baiduAK
string isp = "114.114.114.114".GetISP(); // 擷取ISP營運商資訊
PhysicsAddress physicsAddress = "114.114.114.114".GetPhysicsAddressInfo().Result;// 擷取詳細地理資訊對象
Tuple<string, List<string>> ipAddressInfo = "114.114.114.114".GetIPAddressInfo().Result;// 擷取詳細地理資訊集合
20.元素去重
var list = new List<MyClass>()
{
new MyClass()
{
Email = "[email protected]"
},
new MyClass()
{
Email = "[email protected]"
},
new MyClass()
{
Email = "[email protected]"
}
};
List<MyClass> classes = list.DistinctBy(c => c.Email).ToList();
Console.WriteLine(classes.Count==1);//True
21.枚舉擴充
public enum MyEnum
{
[Display(Name = "讀")]
[Description("讀")]
Read,
[Display(Name = "寫")]
[Description("寫")]
Write
}
Dictionary<int, string> dic1 = typeof(MyEnum).GetDictionary();// 擷取枚舉值和字元串表示的字典映射
var dic2 = typeof(MyEnum).GetDescriptionAndValue();// 擷取字元串表示和枚舉值的字典映射
string desc = MyEnum.Read.GetDescription();// 擷取Description标簽
string display = MyEnum.Read.GetDisplay();// 擷取Display标簽的Name屬性
var value = typeof(MyEnum).GetValue("Read");//擷取字元串表示值對應的枚舉值
string enumString = 0.ToEnumString(typeof(MyEnum));// 擷取枚舉值對應的字元串表示
22.定長隊列和ConcurrentHashSet實作
如果是.NET5及以上,推薦使用架構自帶的Channel實作該功能
LimitedQueue<string> queue = new LimitedQueue<string>(32);// 聲明一個容量為32個元素的定長隊列
ConcurrentLimitedQueue<string> queue = new ConcurrentLimitedQueue<string>(32);// 聲明一個容量為32個元素的線程安全的定長隊列
var set = new ConcurrentHashSet<string>(); // 用法和hashset保持一緻
23.反射操作
MyClass myClass = new MyClass();
PropertyInfo[] properties = myClass.GetProperties();// 擷取屬性清單
myClass.SetProperty("Email","[email protected]");//給對象設定值
myClass.DeepClone(); // 對象深拷貝,帶嵌套層級的
24.郵件發送
new Email()
{
SmtpServer = "smtp.masuit.com",// SMTP伺服器
SmtpPort = 25, // SMTP伺服器端口
EnableSsl = true,//使用SSL
Username = "[email protected]",// 郵箱使用者名
Password = "123456",// 郵箱密碼
Tos = "[email protected],[email protected]", //收件人
Subject = "測試郵件",//郵件标題
Body = "你好啊",//郵件内容
}.SendAsync(s =>
{
Console.WriteLine(s);// 發送成功後的回調
});// 異步發送郵件
25.圖像的簡單處理
ImageUtilities.CompressImage(@"F:\src\1.jpg", @"F:\dest\2.jpg");//無損壓縮圖檔
"base64".SaveDataUriAsImageFile();// 将Base64編碼轉換成圖檔
Image image = Image.FromFile(@"D:\1.jpg");
image.MakeThumbnail(@"D:\2.jpg", 120, 80, ThumbnailCutMode.LockWidth);//生成縮略圖
Bitmap bmp = new Bitmap(@"D:\1.jpg");
Bitmap newBmp = bmp.BWPic(bmp.Width, bmp.Height);//轉換成黑白
Bitmap newBmp = bmp.CutAndResize(new Rectangle(0, 0, 1600, 900), 160, 90);//裁剪并縮放
bmp.RevPicLR(bmp.Width, bmp.Height);//左右鏡像
bmp.RevPicUD(bmp.Width, bmp.Height);//上下鏡像
var marker=ImageWatermarker(stream);
stream=maker.AddWatermark("水印文字","字型檔案",字型大小,color,水印位置,邊距); // 給圖檔添加水印
stream=maker.AddWatermark(水印圖檔,水印位置,邊距,字型大小,字型); // 給圖檔添加水印
// 圖像相似度對比
var hasher = new ImageHasher();
var hash1 = hasher.DifferenceHash256("圖檔1"); // 使用差分雜湊演算法計算圖像的256位哈希
var hash2 = hasher.DifferenceHash256("圖檔2"); // 使用差分雜湊演算法計算圖像的256位哈希
//var hash1 = hasher.AverageHash64("圖檔1"); // 使用平均值算法計算圖像的64位哈希
//var hash2 = hasher.AverageHash64("圖檔2"); // 使用平均值算法計算圖像的64位哈希
//var hash1 = hasher.DctHash("圖檔1"); // 使用DCT算法計算圖像的64位哈希
//var hash2 = hasher.DctHash("圖檔2"); // 使用DCT算法計算圖像的64位哈希
//var hash1 = hasher.MedianHash64("圖檔1"); // 使用中值算法計算給定圖像的64位哈希
//var hash2 = hasher.MedianHash64("圖檔2"); // 使用中值算法計算給定圖像的64位哈希
var sim=ImageHasher.Compare(hash1,hash2); // 圖檔的相似度,範圍:[0,1]
var imageFormat=stream.GetImageType(); // 擷取圖檔的真實格式
26.随機數
Random rnd = new Random();
int num = rnd.StrictNext();//産生真随機數
double gauss = rnd.NextGauss(20,5);//産生正态高斯分布的随機數
var s = new NumberFormater(62).ToString(new Random().Next(100000, int.MaxValue));//生成随機字元串
27.權重篩選功能
var data=new List<WeightedItem<string>>()
{
new WeightedItem<string>("A", 1),
new WeightedItem<string>("B", 3),
new WeightedItem<string>("C", 4),
new WeightedItem<string>("D", 4),
};
var item=data.WeightedItem();//按權重選出1個元素
var list=data.WeightedItems(2);//按權重選出2個元素
var selector = new WeightedSelector<string>(new List<WeightedItem<string>>()
{
new WeightedItem<string>("A", 1),
new WeightedItem<string>("B", 3),
new WeightedItem<string>("C", 4),
new WeightedItem<string>("D", 4),
});
var item = selector.Select();//按權重選出1個元素
var list = selector.SelectMultiple(3);//按權重選出3個元素
28.EF Core支援AddOrUpdate方法
/// <summary>
/// 按Id添加或更新文章實體
/// </summary>
public override Post SavePost(Post t)
{
DataContext.Set<Post>().AddOrUpdate(t => t.Id, t);
return t;
}
29.敏感資訊掩碼
"13123456789".Mask(); // 131****5678
"[email protected]".MaskEmail(); // a****[email protected]
等等省略一百項
項目位址
文檔位址:https://github.com/ldqk/Masuit.Tools