usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Collections;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Text;
usingSystem.Drawing;
publicpartialclassCnCode:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
//获取GB2312编码页(表)
Encodinggb=Encoding.GetEncoding("gb2312");
//调用函数产生4个随机中文汉字编码
object[]bytes=CreateRegionCode(4);
//根据汉字编码的字节数组解码出中文汉字
stringstr1=gb.GetString((byte[])Convert.ChangeType(bytes[0],typeof(byte[])));
stringstr2=gb.GetString((byte[])Convert.ChangeType(bytes[1],typeof(byte[])));
stringstr3=gb.GetString((byte[])Convert.ChangeType(bytes[2],typeof(byte[])));
stringstr4=gb.GetString((byte[])Convert.ChangeType(bytes[3],typeof(byte[])));
//输出的控制台
CreateImage(str1+str2+str3+str4);
}
/*
此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将
四个字节数组存储在object数组中。
参数:strlength,代表需要产生的汉字个数
*/
publicstaticobject[]CreateRegionCode(intstrlength)
{
//定义一个字符串数组储存汉字编码的组成元素
string[]rBase=newString[16]{"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
Randomrnd=newRandom();
//定义一个object数组用来
object[]bytes=newobject[strlength];
/**//*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中
每个汉字有四个区位码组成
区位码第1位和区位码第2位作为字节数组第一个元素
区位码第3位和区位码第4位作为字节数组第二个元素
*/
for(inti=0;i<strlength;i++)
{
//区位码第1位
intr1=rnd.Next(11,14);
stringstr_r1=rBase[r1].Trim();
//区位码第2位
rnd=newRandom(r1*unchecked((int)DateTime.Now.Ticks)+i);//更换随机数发生器的种子避免产生重复值
intr2;
if(r1==13)
{
r2=rnd.Next(0,7);
}
else
{
r2=rnd.Next(0,16);
}
stringstr_r2=rBase[r2].Trim();
//区位码第3位
rnd=newRandom(r2*unchecked((int)DateTime.Now.Ticks)+i);
intr3=rnd.Next(10,16);
stringstr_r3=rBase[r3].Trim();
//区位码第4位
rnd=newRandom(r3*unchecked((int)DateTime.Now.Ticks)+i);
intr4;
if(r3==10)
{
r4=rnd.Next(1,16);
}
elseif(r3==15)
{
r4=rnd.Next(0,15);
}
else
{
r4=rnd.Next(0,16);
}
stringstr_r4=rBase[r4].Trim();
//定义两个字节变量存储产生的随机汉字区位码
bytebyte1=Convert.ToByte(str_r1+str_r2,16);
bytebyte2=Convert.ToByte(str_r3+str_r4,16);
//将两个字节变量存储在字节数组中
byte[]str_r=newbyte[]{byte1,byte2};
//将产生的一个汉字的字节数组放入object数组中
bytes.SetValue(str_r,i);
}
returnbytes;
}
privatevoidCreateImage(stringcheckCode)
{
intiwidth=(int)(checkCode.Length*25);
System.Drawing.Bitmapimage=newSystem.Drawing.Bitmap(iwidth,20);
Graphicsg=Graphics.FromImage(image);
Fontf=newSystem.Drawing.Font("Arial",12,System.Drawing.FontStyle.Bold);
Brushb=newSystem.Drawing.SolidBrush(Color.White);
//g.FillRectangle(newSystem.Drawing.SolidBrush(Color.Blue),0,0,image.Width,image.Height);
g.Clear(Color.Blue);
g.DrawString(checkCode,f,b,3,3);
PenblackPen=newPen(Color.Black,0);
Randomrand=newRandom();
for(inti=0;i<4;i++)
{
inty=rand.Next(image.Height);
g.DrawLine(blackPen,0,y,image.Width,y);
}
System.IO.MemoryStreamms=newSystem.IO.MemoryStream();
image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType="image/png";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}
}
该文章转载自'大智の博客':http://www.csafe.cn/article.asp?id=1274