前几日用了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);
}
}
}
转载于:https://blog.51cto.com/dabao2010/1156721