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

原创 2013年12月03日 21:52:49

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:

 

 

使用链栈来对十进制数进行任意进制的转换

使用C语言,和辗转相除法,通过链栈来实现一个十进制数字对任意进制的一个转换。...

C#生成短地址+任意进制转换

参考文章:http://www.cnblogs.com/xiwix/archive/2012/04/15/2450684.html 提取出C#部分内容,亲测可用! 生成短地址-算法原理 ...

字符串编程(3)——高精度任意进制加法找回文数

问题描述   若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。   例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。   又...

使用JavaScript进行进制转换将字符串转换为十进制

1.将数字转换成十进制 parseInt(res,x); 将任意进制字符串转换为十进制,x为如二进制,八进制,十六进制, 第二数数不写即为最常用的转换为整型十进制; var res=1000...

三字符字典内的序号与字符串互查 - 进制转换

SIGMA={a,b,c}  SIGMA* is based on SIGMA with these rules: 1. SIGMA ⊆ SIGMA* 2. if s1∈SIGMA*, s2∈ S...

加解密后字节数组和(16进制)字符串的相互转换问题

前面几篇博客简单归纳了Android中有涉及到的编码和加解密相关的问题,在这里想再补充下加密解密过程中遇到的字节数组和字符串的转换问题。前面博客中包含了转换的代码,由于这个属于所有加解密共性的问题,所...
  • liugec
  • liugec
  • 2017年05月07日 17:48
  • 153

任意进制转换

  • 2011年12月14日 13:10
  • 265B
  • 下载

无符号十进制整数转换成任意进制数

题目:将一个无符号整数转换为任意 d 进制数( 2 ≤ d ≤ 16 )。 思路:先举个例子。十进制100怎么转换为二进制呢? 记住:d进制的数就是0~(d-1)。 一般都是用辗转相除法(应该是叫这...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#中使用进制转换思想对字符串进行任意进制任意字典的加密和解密
举报原因:
原因补充:

(最多只允许输入30个字)