汉字的验证码

public partial class KeleyiImage : System.Web.UI.Page    

  {

        protected void Page_Load(object sender, EventArgs e)

        {

            this.CreateCheckCodeImage(GenerateCheckCode());

        }

        private string GenerateCheckCode()

        {

            //int number;

            //char code;

            string checkCode = String.Empty;

            System.Random random = new Random();  

           Encoding gb = Encoding.GetEncoding("gb2312");

            //调用函数产生4个随机中文汉字编码 柯乐义  

           object[] bytes = CreateRegionCode(6);

            //根据汉字编码的字节数组解码出中文汉字  

           string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));

            string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));

            string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));

            string str4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));

            //输出的控制台  

           checkCode = str1 + str2 + str3 + str4;   

          Response.Cookies.Add(new HttpCookie("ValidCode", checkCode));    

          return checkCode;

        }

        #region 产生波形滤镜效果

        private static object[] CreateRegionCode(int strlength)

        {

            //定义一个字符串数组储存汉字编码的组成元素

            string[] rBase = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

            Random rnd = new Random();

            //定义一个object数组用来

            object[] bytes = new object[strlength];

            /*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中

            每个汉字有四个区位码组成

            区位码第1位和区位码第2位作为字节数组第一个元素

            区位码第3位和区位码第4位作为字节数组第二个元素

            */

            for (int i = 0; i < strlength; i++)

            {  

               //区位码第1位

                int r1 = rnd.Next(11, 14);   

              string str_r1 = rBase[r1].Trim();

                //区位码第2位

                rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i)//更换随机数发生器的

                //种子避免产生重复值

                int r2;

                if (r1 == 13)

                {

                    r2 = rnd.Next(0, 7);

                }

                else  

               {

                    r2 = rnd.Next(0, 16);

                }

                string str_r2 = rBase[r2].Trim();

                //区位码第3位

                rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);

                int r3 = rnd.Next(10, 16);

                string str_r3 = rBase[r3].Trim();

转载于:https://www.cnblogs.com/Yida-Tingting/p/4571541.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值