using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace DG.Tool { public static class ResUtil { //生成resid public static string CreateResId(string number) { number = number.Replace("+86", ""); if (number.StartsWith("01") && number.Length == 12) { number = number.Substring(1); } //1、正则表达式提取数字串值 number = Regex.Replace(number, @"[^\d.\d]", "", RegexOptions.IgnoreCase); //*******开始resid算法******************// bool ismobile = ChekMobile(number) || ChekMobile(number.TrimStart('0')); if (ismobile) number = number.TrimStart('0'); string bkn_ms_52 = InReversibleStr(number, ismobile); string kn_ms_6 = ReversibleStr(number); string resId = MixResID(bkn_ms_52, kn_ms_6, number, ismobile); return resId; } /// /// 00852+8位是香港的电话 /// /// /// public static bool ChekMobile(string number) { string rgs = @"^(13|14|15|16|17|18|19|0085)\d{9}$"; Regex reg = new Regex(rgs); return reg.IsMatch(number); } /// /// 检查是否包含手机号码 /// /// /// public static bool ContainMobile(string number) { string rgs = @".*(13|14|15|16|17|18|19)\d{9}.*"; Regex reg = new Regex(rgs); return reg.IsMatch(number); } public static bool CheckIsNum(string txt) { string rgs = "^\\d{6,16}$"; Regex reg = new Regex(rgs); return reg.IsMatch(txt); } public static string UserMd5(string str) { var cl = str; var result = string.Empty; var md5 = MD5.Create();//实例化一个md5对像 // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择  var s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl)); // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得 for (int i = 0; i < s.Length; i++) { // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符 result = result + s[i].ToString("x2"); } return result; } public static string NumberFormat(string number) { if (string.IsNullOrEmpty(number) || number.Length <= 6) { return number; } return number.Substring(0, 3) + new string('*', number.Length - 6) + number.Substring(number.Length - 3); } /// /// 不可逆密码串 /// /// /// private static string InReversibleStr(string number, bool ismobile) { //11位手机前补'x'、不足12位的号码前补'0,超过12位的取后12位 string rnum = ismobile ? "x" + number : number; rnum = rnum.PadLeft(12, '0'); rnum = rnum.Substring(rnum.Length - 12); string strms = EncryptMD5(rnum + "@no_zuo_no_die@").Substring(10, 13); Int64 si = Convert.ToInt64(strms, 16); return Convert.ToString(si, 2).PadLeft(52, '0'); } /// /// md5加密 /// /// /// public static string EncryptMD5(string input) { if (string.IsNullOrEmpty(input)) { return string.Empty; } MD5 md5 = MD5.Create(); byte[] data = md5.ComputeHash(Encoding.Default.GetBytes(input)); // Create a new Stringbuilder to collect the bytes // and create a string. StringBuilder sBuilder = new(); // Loop through each byte of the hashed data // and format each one as a hexadecimal string. for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } return sBuilder.ToString(); } /// /// 生成可逆密码串 /// /// /// private static string ReversibleStr(string number) { //2位可逆 int H2 = Int32.Parse(number.Substring(number.Length - 2)) % 64; string strms = Convert.ToString(Convert.ToInt64(H2), 2).PadLeft(6, '0'); return MixKN_MS(strms, true); } private static string MixResID(string bkn_ms, string kn_ms, string number, bool ismobile) { StringBuilder sb = new StringBuilder(); int i = 0; for (; i < kn_ms.Length; i++) { sb.Append(bkn_ms.Substring(i * 2, 2)); sb.Append(kn_ms.Substring(i, 1)); } sb.Append(bkn_ms.Substring(i * 2)); sb.Append(ismobile ? "1" : "0"); return Convert2TO10(sb.ToString()).ToString().PadLeft(18, '0'); } private static string MixKN_MS(string kn_ms, bool bMix) { int iMove = 2; StringBuilder sb = new StringBuilder(); if (bMix) { kn_ms = kn_ms.Substring(kn_ms.Length - iMove) + kn_ms.Substring(0, kn_ms.Length - iMove); } for (int i = 0; i < kn_ms.Length / 2; i++) { sb.Append(kn_ms[i * 2 + 1]); sb.Append(kn_ms[i * 2]); } kn_ms = sb.ToString(); if (!bMix) { kn_ms = kn_ms.Substring(iMove) + kn_ms.Substring(0, iMove); } return kn_ms; } /// /// 返回后二位的手机号码串 /// /// /// public static string Reve_ms(string resId) { string code = Convert10TO2(Convert.ToDecimal(resId)).PadLeft(59, '0'); code = code.Substring(code.Length - 59); StringBuilder sb = new StringBuilder(); for (int i = 1; i <= 6; i++) { sb.Append(code[i * 3 - 1]); } code = MixKN_MS(sb.ToString(), false); code = Convert.ToInt32(code, 2).ToString().PadLeft(2, '0'); return "*********" + code; } /// /// 二进制转十进制 /// /// /// public static decimal Convert2TO10(string resid) { decimal residNum = 0; string str = resid; for (int i = 0, j = resid.Length - 1; i < resid.Length; i++, j--) { string bitebag = resid.Substring(j, 1); decimal t = Convert.ToInt32(bitebag) * Pow(i); residNum = residNum + t; } return residNum; } /// /// 十进制转二进制 /// /// /// public static string Convert10TO2(decimal resudnum) { string str = string.Empty; while (resudnum > 0) { int y = Convert.ToInt32(resudnum % Convert.ToDecimal(2)); resudnum = Math.Floor(resudnum / Convert.ToDecimal(2)); str = y.ToString() + str; } return str; } public static decimal Pow(int y) { decimal pow = 1; if (y == 0) { pow = 1; } else if (y == 1) { pow = 2; } else { pow = 2; while (y > 1) { pow = pow * 2; y--; } } return pow; } } }