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#实现整型数据字任意编码任意进制的转换和逆转换简介

 又是个闲极无聊的下午,无聊写了这么个东西,可以实现任意整数按照任意编码和任意进制的转换和逆向转换。 用途: 恶。。这个我也不清楚,目前看来可以用来做验证码,用来做短网址,其他?暂时没有...
  • daonidedie
  • daonidedie
  • 2014年12月01日 09:46
  • 1040

C实现任意进制数的转化

该实例要求使用C实现一个无符号整数到[2,16]进制数的转换。这个还是比较好想的,就是对该无符号整数不断的斤进制数d取余数,取商,一直做这样的运算,直到商为0为止,将所有的余数按照从后往前的顺序穿起来...
  • hongbochen1223
  • hongbochen1223
  • 2015年04月24日 14:19
  • 3003

js任意进制转换--parseInt与toString

1. js可以很简单的做任意进制的转化,核心函数是全局函数parseInt(str,radix)与Number.toString(radix); 2. parseInt(str,radix); ...
  • Maci_yera
  • Maci_yera
  • 2017年10月18日 22:14
  • 108

Java小案例——对字符串进行加密解密

本例通过位运算的疑惑运算符把字符串与一个制定的值进行以后运算,从而改变字符串中每个字符的值,这样就可以得到一个加密后的字符串,当把加密后的字符串作为程序输入内容,异或运算会把加密后的字符串还原为原字符...
  • Mus_Li
  • Mus_Li
  • 2017年06月03日 09:39
  • 389

C++实现——任意进制之间的转换

#include #include using namespace std; //任意进制之间的转换/** * s1 转换之前的数 * s2 转换之后的数 * d1 原进制数 * d2 需要转...
  • langmanqishizaijia
  • langmanqishizaijia
  • 2016年04月07日 17:11
  • 9148

用栈实现将十进制数转换为任意进制数(2,8,16...).

解题思路:假如N为输入的数,n为要转换为的进制,若要将十进制231转换为8进制数,过程如下; N                        N/n                      N%n...
  • acm_JL
  • acm_JL
  • 2016年03月06日 15:19
  • 5264

Java实现任意进制转换

问题:将m进制num转换为n进制 (2
  • u012027907
  • u012027907
  • 2017年08月29日 17:44
  • 1952

利用递归实现10进制转化成任意进制

c++/c代码实现过程 #include #include using namespace std; void translation(char *s,int a,int b); int main(...
  • Reoger
  • Reoger
  • 2016年03月16日 21:21
  • 1408

java 数字的进制转换

对整数进行进制转换,有现成的函数,就不需要倒着求余数了: package hdu; public class sum { public static void main(String[] arg...
  • z8110
  • z8110
  • 2016年05月20日 22:46
  • 832

十进制与自定义任意进制转换代码

有时我们在使用十进制的时候,会有长度过长情况。如加密或传输的过程中,日期数据20141230 使用进制转换可以少好几位长度。 因此写了一个十进制与任意自定义进制转换的工具类,可以将十进制转换成任意进制...
  • yuquan0405
  • yuquan0405
  • 2015年04月29日 09:04
  • 2226
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#中使用进制转换思想对字符串进行任意进制任意字典的加密和解密
举报原因:
原因补充:

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