生成中文汉字验证码原理

原文出处http://edu.cn700.com/Edu_24/2005490187-1.html 仅供学习研究用 

 /// <summary>
  /// 随机产生一个汉字
  /// </summary>
  /// <returns></returns>
  private String CreateWord()
  {
   //汉字编码组成元素
   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();

   //区位码第一位
   int r1 = rnd.Next(11,14);//汉字编码是从b0开始的,到d7是常用的汉字
   String r1String = rBase[r1].ToString().Trim();

   //区位码第二位
   rnd = new Random(r1*unchecked((int)DateTime.Now.Ticks));//更换随机数发生器的种子避免产生重复值
   int r2;
   if(r1==13)
   {
    r2 = rnd.Next(0,7);//区位D7开始以后的汉字都是很难见到的繁杂汉字
   }
   else
   {
    r2 = rnd.Next(0,16);
   }
   String r2String = rBase[r2].ToString().Trim();

   //区位码第三位
   rnd = new Random(r2*unchecked((int)DateTime.Now.Ticks));
   int r3 = rnd.Next(10,16);
   String r3String = rBase[r3].ToString().Trim();

   //区位码第四位
   rnd = new Random(r3*unchecked((int)DateTime.Now.Ticks));
   int r4;
   if(r3==10)
   {
    r4 = rnd.Next(1,16);//每区的第一个位置是空的
   }
   else
   {
    if(r3==15)
    {
     r4 = rnd.Next(0,15);//每区的最后一个位置也是空的
    }
    else
     r4 = rnd.Next(0,16);
   }
   String r4String = rBase[r4].ToString().Trim();

   //定义两个字节变量存储产生的随机汉字区位码
   byte byte1 = Convert.ToByte(r1String+r2String,16);
   byte byte2 = Convert.ToByte(r3String+r4String,16);

   //将产生的一个汉字的字节数组放入一个byte数组中
   byte[] wordByte = new byte[]{byte1,byte2};

   //输出
   Encoding gb = Encoding.GetEncoding("gb2312");
   String word = gb.GetString(wordByte,0,wordByte.Length);
   return word;
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值