C#实现整型数据字任意编码任意进制的转换和逆转换
又是个闲极无聊的下午,无聊写了这么个东西,可以实现任意整数按照任意编码和任意进制的转换和逆向转换。
用途:
恶。。这个我也不清楚,目前看来可以用来做验证码,用来做短网址,其他?暂时没有想到。
上图先:
实现如下:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace ConsoleApplication1
7 {
8
9 public class Number
10 {
11 public string Characters
12 {
13 get;
14 set;
15 }
16
17 public int Length
18 {
19 get
20 {
21 if (Characters != null)
22 return Characters.Length;
23 else
24 return 0;
25 }
26
27 }
28
29 public Number()
30 {
31 Characters = "0123456789";
32 }
33
34 public Number(string characters)
35 {
36 Characters = characters;
37 }
38
39 /// <summary>
40 /// 数字转换为指定的进制形式字符串
41 /// </summary>
42 /// <param name="number"></param>
43 /// <returns></returns>
44 public string ToString(long number)
45 {
46 List<string> result = new List<string>();
47 long t = number;
48
49 while (t > 0)
50 {
51 var mod = t % Length;
52 t = Math.Abs(t / Length);
53 var character = Characters[Convert.ToInt32(mod)].ToString();
54 result.Insert(0, character);
55 }
56
57 return string.Join("", result.ToArray());
58 }
59
60 /// <summary>
61 /// 指定字符串转换为指定进制的数字形式
62 /// </summary>
63 /// <param name="str"></param>
64 /// <returns></returns>
65 public long FromString(string str)
66 {
67 long result = 0;
68 int j = 0;
69 foreach (var ch in new string(str.ToCharArray().Reverse().ToArray()))
70 {
71 if (Characters.Contains(ch))
72 {
73 result += Characters.IndexOf(ch) * ((long)Math.Pow(Length, j));
74 j++;
75 }
76 }
77 return result;
78 }
79
80 }
81
82
83
84 class Program
85 {
86 static void Print(long number, Number adapter)
87 {
88 Console.WriteLine("输入数字:{0}", number);
89 Console.WriteLine("规则:{0}\t\t进制:{1}进制", adapter.Characters,adapter.Length);
90 var numtostr = adapter.ToString(number);
91 Console.WriteLine("转换结果:{0}", numtostr);
92 var strtonum = adapter.FromString(numtostr);
93 Console.WriteLine("逆向转换结果:{0}", strtonum);
94 Console.WriteLine();
95 Console.WriteLine("============ 无聊的分割线 ============");
96 Console.WriteLine();
97 }
98
99 static void Main(string[] args)
100 {
101 //传统的2进制
102 Number n1 = new Number("01");
103 //传统的8进制
104 Number n2 = new Number("01234567");
105 //传统的16进制
106 Number n3 = new Number("0123456789ABCDEF");
107 //自定义编码的N进制,这个可以用来做验证码?
108 Number n4 = new Number("爹妈说名字太长躲在树后面会被部落发现");
109 //山寨一个短网址
110 Number n5 = new Number("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
111
112 Print(65535, n1);
113 Print(65535, n2);
114 Print(65535, n3);
115 Print(65535, n4);
116 Print(165535, n5);
117
118 Console.ReadKey();
119
120 }
121 }
122 }
写完,刚好6点,收拾下班