using System; using System.Text; using System.Text.RegularExpressions; namespace WX.CRM.Common { public 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 = Utility.ChekMobile(number) || Utility.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; } /// /// 不可逆密码串 /// /// /// 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 = Utility.EncryptMD5(rnum + "@no_zuo_no_die@").Substring(10, 13); Int64 si = Convert.ToInt64(strms, 16); return Convert.ToString(si, 2).PadLeft(52, '0'); } /// /// 生成可逆密码串 /// /// /// 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; } } }