前几日用了win7 X64系统,想转换一下联通宽带账号,从网上下了个软件,X64的机器竟然运行不了。
于是就上网搜这个源码,但是搜了半天,搜到一个PHP的和一个ASP的,可是我还看不懂这两种。只好硬着头皮照着改成C#的吧。
于是一边搜索对应的PHP或ASP的方法的意思一边用C#对应的方法去改。
下面是代码:
using System; using System.Text.RegularExpressions; /* * Desc:河南联通宽带账号算号 * Author:小火柴https://dabao.me * Date:2012-2-26 11:03 */ namespace CncDecode { class Program { static void Main(string[] args) { //测试一下 Console.Write("请输入要转换的网通账号:"); string num = Console.ReadLine(); Regex r = new Regex(@"^[0-9]+$"); string num1 = ""; if (r.Match(num).Success) num1 = num; else return; CNC.DeCode(ref num1); Console.WriteLine("账号{0}转换后为{1}", num, num1); Console.ReadLine(); } } /// <summary> /// 解码类 /// </summary> static class CNC { /// <summary> /// 解码 /// </summary> /// <param name="num">号码</param> public static void DeCode(ref string num) { //这一堆的什么东西也看不懂,也查不到有这么个算法,估计是联通程序员自己写的一个私有算法 string ustr = "9012345678abcdeABCDEFGHIJKLMNfghijklmnUVWXYZxyzuvwopqrstOPQRST"; string yinzi = "25-35-182-236-43-41-53-18-226-215-24-117-35-201-52-17"; string[] yzarr = yinzi.Split('-'); Array.Reverse(yzarr);//反转一个一维数组中元素的顺序 int l = 37, k = 0, u1, x; char[] dec_str = new char[num.Length]; for (int i = 0; i < num.Length; i++) { for (int j = 0; j < ustr.Length; j++) { if (num[i] == ustr[j]) { if (i < 16) { u1 = Convert.ToInt32(yzarr[i]); } else { x = i % 16; u1 = Convert.ToInt32(yzarr[x]); } u1 = ((u1 ^ (l * 3)) ^ k) + j; x = u1 % 62; dec_str.SetValue(ustr[x], i); l = l ^ (x + 9433); break; } } if (dec_str[i].ToString() == "") dec_str.SetValue(ustr[i], i); k = k + 5; } num = "2:" + new string(dec_str); } } }