.Net编程

.NET实现中英文验证码

日期:2015/6/28来源: IT猫扑网

  最终效果如图:

   

  CheckCode.aspx.cs代码如下

  1    protected void Page_Load(object sender, EventArgs e)

  2    {

  3  //获取GB2312编码页(表)

  4  /**//**

  5   * 生成中文验证验码所要使用的方法

  6   * 注,生成中文验证码时要改变一下生成验证码图片的宽度

  7   * var imageCode = new System.Drawing.Bitmap((int)Math.Ceiling((code.Length * 22.5)), 23); //定义图片的宽度和高度

  8   **/

  9

  10  //var gb = Encoding.GetEncoding("gb2312");

  11

  12  /**/////调用函数产生4个随机中文汉字编码

  13  //object[] bytes = CreateRegionCode(4);

  14

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

  16  //var sbCode = new StringBuilder().Append(gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[]))))

  17  //    .Append(gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[]))))

  18  //    .Append(gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[]))))

  19  //    .Append(gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[]))));

  20  //CreateCheckCodeImage(sbCode.ToString());

  21

  22  CreateCheckCodeImage(GenerateCheckCode());      //生成数字英文所要使用的方法

  23    }

  24

  25    生成汉字验证码#region 生成汉字验证码

  26    /**//// <summary>

  27    /// 此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将四个字节数组存储在object数组中。

  28    /// </summary>

  29    /// <param name="strLength">代表需要产生的汉字个数</param>

  30    /// <returns></returns>

  31    static object[] CreateRegionCode(int strLength)

  32    {

  33  var rBase = new[]

  34      {

  35    "0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"

  36      };

  37

  38  var random = new Random();

  39  var bytes = new object[strLength];

  40

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

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

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

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

  45  */

  46

  47  for (int i = 0; i < strLength; i++)

  48  {

  49      //区位码第1位

  50      var r1 = random.Next(11, 14);

  51      var str_r1 = rBase[r1].Trim();

  52

#p#副标题#e#

  53      random = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i);   //更换随机数发生器的种子避免产生重复值

  54

  55      var r2 = 0;

  56      if (r1 == 13)

  57    r2 = random.Next(0, 7);

  58      else

  59    r2 = random.Next(0, 16);

  60

  61      var str_r2 = rBase[r2].Trim();

  62

  63      //区位码第3位

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

  65      var r3 = random.Next(10, 16);

  66      var str_r3 = rBase[r3].Trim();

  67

  68      //区位码第4位

  69      random = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);

  70      var r4 = 0;

  71      if (r3 == 10)

  72    r4 = random.Next(1, 16);

  73      else if (r3 == 15)

  74    r4 = random.Next(0, 15);

  75      else

  76    r4 = random.Next(0, 16);

  77

  78      var str_r4 = rBase[r4].Trim();

  79

  80      var byte1 = Convert.ToByte(str_r1 + str_r2, 16);

  81      var byte2 = Convert.ToByte(str_r3 + str_r4, 16);

  82      //将两个字节变量存储在字节数组中

  83      var str_r = new[] { byte1, byte2 };

  84

  85      //将产生的一个汉字的字节数组放入object数组中

  86      bytes.SetValue(str_r, i);

  87    

相关文章

相关下载

网友评论

我要评论...
    没有更早的评论了
    取消