前幾日用了win7 X64系統,想轉換一下聯通寬帶賬號,從網上下了個軟件,X64的機器竟然運行不了。
於是就上網搜這個源碼,但是搜了半天,搜到一個PHP的和一個ASP的,可是我還看不懂這兩種。只好硬着頭皮照着改成C#的吧。
於是一邊搜索對應的PHP或ASP的方法的意思一邊用C#對應的方法去改。
下面是代碼:
using System;
using System.Text.RegularExpressions;
/*
* Desc:河南聯通寬帶賬號算號
* Author:大寶http://dabao.im,http://dabao2010.blog.51cto.com
* Date:2012-2-26 11:03
*/
namespace CncDecode
{
class Program
{
staticvoid 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>
staticclass CNC
{
/// <summary>
/// 解碼
/// </summary>
/// <param name="num">號碼</param>
publicstaticvoid DeCode(refstring 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 = newchar[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:" + newstring(dec_str);
}
}
}