MD5,进程,线程,GDI

本文介绍如何使用MD5加密算法对字符串进行不可逆加密,并演示了使用GDI+进行图形绘制的过程,包括如何生成验证码图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

md5加密

将字符串进行加密,无法解密。网上的解密方式也都是在库里找,找不到也没有。

 1 PRotected void Page_Load(object sender, EventArgs e)
 2 {
 3     string s = "123";
 4     Response.Write(getMd5(s));
 5 }
 6 public string getMd5(string str)
 7 {
 8     MD5 md5 = MD5.Create();//MD5抽象类无法实例化 实例化该方法
 9     byte[] buffer = Encoding.Default.GetBytes(str); //将字符串转换为字节数组
10     byte[] mdbuffer = md5.ComputeHash(buffer); //调用ComputeHash方法把数组传进去
11     //将字节数组中每个元素ToString();
12     StringBuilder result = new StringBuilder();
13     for (int i = 0; i < mdbuffer.Length; i++)
14     {
15         result.Append(mdbuffer[i].ToString("x2")); //ToString得到十进制字符串 ToString("x")十六进制字符串 ToString("x2")对齐
16     }
17     return result.ToString();
18 }

进制

表示某一位置上的数运算时是逢X进一位。二进制就是逢二进一, 十进制是逢十进一,十六进制是逢十六进一,以此类推.

so:二进制001010101只有0和1计算机中的数据都是二进制表示,四进制以0、1、2、3四个数字表示任何实数。十进制0~9数字组成,十六进制0~9以及ABCEDF组成(表示十进制数)10~15

ToString的特殊方法

时间:now.ToString("yyyy-MM-dd hh:mm:ss") 年-月-日 时:分:秒 具体可以自定单独写f y m d t 意义不同前者都可实现

字符型转换:int.ToString("n"); 640,000.00; int.ToString("C"); ¥640,000.00; .ToString("x");16进制

Directory类

用来操作文件夹的

 1 Directory.CreateDirectory("d:/ccc/cc"); //创建文件夹
 2 
 3 Directory.Delete("d:/ccc",true); //true删除非空文件夹
 4 
 5 Directory.Move(@"d:/ccc", @"d:/cccc"); //剪切操作 源目录没了 必须同一卷轴d盘
 6 
 7 string[] s = Directory.GetFiles(@"D:\项目\Web\Images\shiji"); //获得文件夹目录下所有文件全路径
 8 
 9 string[] s = Directory.GetFiles(@"D:\项目\Web\Images\shiji","*.jpg"); //获得文件夹目录下指定后缀名文件全路径
10 
11 string[] s = Directory.GetDirectories(@"D:\项目\Web\Images"); //获得文件夹目录下的文件夹的全路径
12 
13 Directory.Exists(@"D:\项目\Web\Images") //是否存在某文件夹

进程

我们可以把计算机中每一个运行的应用程序当作是一个进程

 1 ///获得当前程序中正在运行的进程
 2 Process[] pros = Process.GetProcesses();
 3 foreach (var item in pros)
 4 {
    //item.Kill(); //关闭所有进程.
    //item.ProcessName; //进程名
5 Console.Write(item.ToString()); 6 } 7 //通过进程打开一些程序 8 Process.Start("calc"); //打开计算器 9 Process.Start("notepad"); //打开记事本 10 //打开指定文件 11 ProcessStartInfo pro = new ProcessStartInfo(@"d:\11.txt"); 12 Process pr = new Process(); 13 pr.StartInfo = pro; 14 pr.Start();

线程

每一个进程是由多个线程组成的

单线程:让程序做多件事时,会引发卡死 假死状态。

多线程:让一个程序同时处理多个事情,后台运行程序,提高程序的运行效率。

前台线程:只有所有的前台线程都关闭才能完成程序关闭。(winform多窗口时)

后台线程:只要所有的前台线程结束,后台线程自动结束。

 1 //实例化Thread类,并传入一个指向线程所要运行的方法。(这时线程已经产生,但还没有运行)
 2 //调用Thread类的Start方法,标记线程可以被CPU执行了,但具体执行事件由CPU决定。
 3 Thread th = new Thread(Test); //创建一个线程去执行这个方法。
 4 th.IsBackground = true; //将线程设置为后台线程,前台关闭后 线程结束。
 5 th.Start(); //标记准备就绪,可以随意被执行,具体什么时候执行由CPU决定。
 6 //在.net下是不允许跨线程访问的。
 7 //有时候需要手动释放线程 关闭时 判断线程是否关闭 
 8 if (th != null)
 9 {
10     th.Abort(); //结束这个线程 不能再Start()
11 }
12 Thread.Sleep(3000); //睡眠3秒后执行
13 //线程执行带参数方法
14 Thread.Start("123"); object类型参数 在start后括号写参数

多用于大量数据时,多分一个线程去搜索数据,然后存储到缓存里,页面再用异步获取缓存中的数据。

GDI+

是一种绘图装置接口,可以用来绘制图片。

画直线

Graphics g = this.CreateGraphics(); //创建GDI对象
Pen pen = new Pen(Brushes.Yellow); //创建画笔
Point p1 = new Point(30, 50); //创建两个点
Point p2 = new Point(250, 250);
g.DrawLine(pen, p1, p2);

验证码

 1 /// <summary>
 2 /// 字符
 3 /// </summary>
 4 /// <param name="len">几位</param>
 5 /// <returns></returns>
 6 public static string validation(int cd)
 7 {
 8     var ran = new Random();
 9     int num, tem;
10     string rtuStr = "";
11     for (int i = 0; i < cd; i++)
12     {
13         num = ran.Next();
14         if (i % 2 == 1)
15             tem = num % 10 + '0'; //数字
16         else
17             tem = num % 26 + 'A'; //字母
18         rtuStr += Convert.ToChar(tem).ToString();
19     }
20     //写入cookie
21     HttpCookie cookie = new HttpCookie("check");
22     cookie.Value = rtuStr.ToLower();
23     HttpContext.Current.Response.Cookies.Add(cookie);
24     return rtuStr;
25 }
26 
27 /// <summary>
28 /// 生成图像
29 /// </summary>
30 /// <param name="check">字符</param>
31 public static byte[] drawImg(string check)
32 {
33     Bitmap img = new Bitmap(90, 34);
34     var ht = Graphics.FromImage(img);
35     ht.Clear(Color.White);
36     ht.DrawLine(new Pen(Color.SpringGreen), 1, 1, 90, 34);
37     Font font = new Font("微软雅黑", 20, FontStyle.Bold);
38     var jianbian = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Teal, Color.Snow, 2f, true);
39     ht.DrawString(check, font, jianbian, 0, 0);
40     ht.DrawRectangle(new Pen(Color.Aqua), 0, 0, img.Width - 1, img.Height - 1);
41     MemoryStream ms = new MemoryStream();
42     img.Save(ms, ImageFormat.Jpeg);
43     ht.Dispose();
44     img.Dispose();
45     return ms.ToArray();
46 }

mvc中调用

1 public ActionResult ShowValidate()
2 {
3     var check = Common.Validate.validation(4);
4     byte[] buffer = Common.Validate.drawImg(check);
5     return File(buffer, "image/jpeg");
6 }

前台

<img src="/Login/ShowValidate" id="img" οnclick="changeCode()" class="validateImg">

if (validateCode.toLowerCase() == getCode()) {
    return true;        
}        

function changeCode() {
    $("#img").attr("src", $("#img").attr("src") + "?");
}

function getCode() {
    var cookies = document.cookie.split(";");
    for (var i = 0; i < cookies.length; i++) {
        var validate = cookies[i].split("=");
        if (validate[0].replace(/(^\s*)|(\s*$)/g, "") == "check") {
            return validate[1].replace(/(^\s*)|(\s*$)/g,"");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值