您的位置:首页 > 编程语言 > C#

C#中使用进制转换思想对字符串进行任意进制任意字典的加密和解密

2013-12-03 21:52 811 查看
C#中使用进制转换思想对字符串进行任意进制任意字典的加密和解密

class Program
{
static void Main(string[] args)
{
string str;
//str = Console.ReadLine();
str=@"123abc ,./\ 我是中国人 ,。、";
str.Replace(@"\", @"\\");   //解决不能输入'\'的问题,@表示忽略转义符

string characters = "0123456789";   //字典字符串

Console.WriteLine("编码字符串:");
string numToStr = Encode(str, characters);   //编码
Console.WriteLine(numToStr);

Console.WriteLine("解码字符串:");
string strToNum = Decode(numToStr, characters);   //解码
Console.WriteLine(strToNum);

Console.ReadKey();
}

const int chNum = 5;   //需要编码的最大字符的在对应的进制编码时的最大的位数,例如10进制时,汉字在unicode中最后一个汉字是5位,chNum=5;
public static string Encode(string str, string characters)   //参数:str是要编码的字符串,character是要加码的字典
{
List<string> result = new List<string>();

foreach (char ch in str.ToCharArray())   //取出每个字符
{
int t = (int)ch;   //把字符转成对应unicode编码的整数,例如:你 20320

for (int i = 0; i < chNum; i++)   //每一个字符都是等长编码,例如:a-97,你-20320,都编码成5位
{
var mod = t % characters.Length;   //取每一位数值
t = t / characters.Length;
var _ch = characters[Convert.ToInt32(mod)].ToString();   //转换到字典对应的位上
result.Insert(0, _ch);   //编码成新的字符串
}
}

return string.Join("", result.ToArray());   //转换成字符串输出
}

public static string Decode(string str, string characters)
{
List<string> result = new List<string>();

for (int i = 0; i < (str.Length / chNum); i++)   //等长编码,按每chNum位取出一个字符
{
char[] ch = str.Substring(i * chNum, chNum).ToCharArray();   //取出对应为的chNum位字符,转成数组
int power=0;   //次幂计数器
int t=0;   //对应的unicode的数值

foreach (var _ch in new string(ch.Reverse().ToArray()))   //把取出的每一位的字符反向进入转换成原码
{
t += characters.IndexOf(_ch) * ((int)Math.Pow(characters.Length, power));   //在字典中找到第一次出现该字符的值的大小乘上对应进制的次幂
power++;
}

result.Insert(0, ((char)t).ToString());   //把整型变量数值对应的unicode转成对应的char型,插入新的字符串
}

return string.Join("", result.ToArray());   //转成字符输出
}
}


十进制字典顺序编码效果,可以实现任意进制字典乱序的,只需修改对应的字典的和chNum值即可



字典:string characters = "wertyuiop234567890dfgkl;'m,h1q[sj./]zxcvbna"; //字典字符串; chNum=3:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: