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,"");}}
}

XML文件

可扩展标记性语言,用来保存轻量级数据。

XML的标签是成对出现的、并且是区分大小写的。

XML文档必须包含根节点,且只有一个。

创建XML文件

 1 //创建XML对象
 2 XmlDocument doc = new XmlDocument();
 3 //创建文档描述信息
 4 XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
 5 doc.AppendChild(dec);
 6
 7 //创建根节点
 8 XmlElement books = doc.CreateElement("Books");
 9 doc.AppendChild(books);
10
11 //创建子节点
12 XmlElement book1 = doc.CreateElement("Book");
13 books.AppendChild(book1); //将子节点添加到books
14
15 //给book1子节点追加子节点
16 XmlElement name1 = doc.CreateElement("Name");
17 name1.InnerText = "c#"; //赋值 文本值
18 book1.AppendChild(name1);
19
20 XmlElement price1 = doc.CreateElement("Price");
21 price1.InnerXml = "<b>10.0</b>"; //赋值 html标签
22 book1.AppendChild(price1);
23
24 XmlElement items = doc.CreateElement("Items");
25 //给节点增加属性
26 items.SetAttribute("Name", "c#");
27 items.SetAttribute("Price", "10.0");
28 book1.AppendChild(items);
29
30 doc.Save("Books.xml"); //保存
31
32 //创建后
33 <?xml version="1.0" encoding="utf-8"?>
34 <Books>
35   <Book>
36     <Name>c#</Name>
37     <Price>
38       <b>10.0</b>
39     </Price>
40     <Items Name="c#" Price="10.0" />
41   </Book>
42 </Books>

向已有XML文件中追加

1 XmlDocument doc = new XmlDocument();
2 if (File.Exists("Books.xml"))
3 {
4     doc.Load("Books.xml"); //加载 xml
5     XmlElement books = doc.DocumentElement; //得到根节点
6     //再建立元素进行追加
7 }

获取XML文件

 1 XmlDocument doc = new XmlDocument();
 2 doc.Load("Books.xml");
 3
 4 XmlElement books = doc.DocumentElement;
 5 XmlNodeList xnl = books.ChildNodes; //得到所有节点
 6
 7 foreach (XmlNode v in xnl) //遍历得到所有节点值
 8 {
 9     Console.WriteLine(v.InnerText);
10 }
11
12 XmlNodeList xnl1 = doc.SelectNodes("Books/Book/Items"); //查找节点列表
13 foreach (XmlNode node in xnl1)
14 {
15     Console.WriteLine(node.Attributes["Name"].Value); //得到name属性的值
16     Console.WriteLine(node.Attributes["Price"].Value); //得到price属性的值
17 }

删除XML文件

1 XmlDocument doc = new XmlDocument();
2 doc.Load("Books.xml");
3
4 XmlNode xnl = doc.SelectSingleNode("Books/Book"); //查找单一节点
5 xnl.RemoveAll(); //删除全部
6 doc.Save("Books.xml");
7 Console.ReadKey();

LinqToXml

 1 //兼容传统方法创建
 2 XDocument xDoc = new XDocument();
 3 //xDoc.Declaration = new XDeclaration() 默认UTF-8 第一行不需要单独建
 4 XElement xRoot = new XElement("root", "值"); //定义元素
 5
 6 XElement xRoot1 = new XElement("root1");  //定义元素2
 7 xRoot1.Value = "值1";
 8
 9 XAttribute xattr = new XAttribute("Id", "1"); //定义属性
10
11 xDoc.Add(xRoot); //统一使用add添加
12 xRoot.Add(xattr);
13
14 xDoc.Save(@"d:\linqtoxml.xml");
15
16 //真正的linq语法
17 //F#  函数式编程语言
18 new XDocument(
19     new XElement("root",
20         new XAttribute("id", "001"),
21         "值")
22     ).Save(@"d:\2.xml");
23 //链式编程,流水线生产 f1().f2().f3()...
24
25 //查找xml
26 XDocument xdoc = new XDocument(new XElement("root"));//根节点
27 xdoc.Root.Add(new XElement("person",
28     new XAttribute("id", "1"),
29     new XAttribute("name", "zhangsan"),
30     new XAttribute("sex", "1")
31     )); //添加子节点
32 xdoc.Root.Add(new XElement("person",
33    new XAttribute("id", "2"),
34    new XAttribute("name", "lisi"),
35    new XAttribute("sex", "2")
36    ));
37 xdoc.Save(@"d:\2.xml");
38
39 <?xml version="1.0" encoding="utf-8"?>
40 <root>
41   <person id="1" name="zhangsan" sex="1" />
42   <person id="2" name="lisi" sex="2" />
43 </root>
44
45 //开始查找、修改、删除
46
47 XDocument xdoc = XDocument.Load(@"d:\2.xml"); //加载xml
48 foreach (XElement xlt in xdoc.Root.Elements()) //Root根节点 Elements 元素集合
49 {
50     if (xlt.Name.LocalName == "person") //Name节点名 LocalName不带命名空间的节点名
51     {
52         if (xlt.Attribute("id").Value == "1") //判断属性值为1时
53         {
54             Response.Write(xlt.Attribute("name").Value); //输出name
55             xlt.Attribute("name").Value = "newname"; //修改name
56             xlt.Remove(); //删除此节点
57             xdoc.Save(@"d:2.xml");
58         }
59     }
60 }
61
62 //Linq查询语法
63 //Descendants()所有子节点 可加某节点下所有节点
64 var query = from s in xdoc.Descendants() //从集合里找
65             where s.Name.LocalName == "person"
66             select s;
67 foreach (XElement xlt in query)
68 {
69     Response.Write(xlt.Value);
70 }
71
72 //Linq方法语法(lambda表达式)
73 foreach (XElement xlt in xdoc.Descendants().Where(s =>
74 {
75     if (s.Name.LocalName == "name")
76     {
77         return true;
78     }
79     return false;
80 }))
81 {
82     Response.Write(xlt.Value);
83 }

委托
使用delegate定义委托,将一个方法作为参数传给另一个方法。
委托所指向的函数必须返回值与参数相同

  1 /// <summary>
  2 /// 委托语法
  3 /// </summary>
  4 class Program
  5 {
  6     public delegate void delSayhi(string name); //定义委托
  7     static void Main(string[] args)
  8     {
  9         delSayhi del = new delSayhi(sayHiChinese); //实例化委托调用具体方法
 10         del("san"); //执行
 11
 12         delSayhi del1 = sayHiChinese; //直接赋值方式
 13         del1("si");
 14
 15         //匿名函数
 16         delSayhi del2 = delegate(string name) { Console.WriteLine(name + ",思密达"); };
 17         del2("韩国");
 18
 19         //lambda表达式  ()没参数也要写 => { //方法体 } 没参数可以e=> Console.WriteLine(""); 如果只有一句话不用{} 返回的return可以省略
 20         delSayhi del3 = (string name) => { Console.WriteLine(name + ",萨瓦迪卡"); };
 21         del2("泰国");
 22
 23         sayHi("david", sayHiEnglish); //调用自定义方法 参数要调用的方法
 24         Console.ReadKey();
 25     }
 26
 27     public static void sayHi(string name, delSayhi del) //定义方法 类型委托
 28     {
 29         del(name);
 30     }
 31
 32     public static void sayHiChinese(string name)
 33     {
 34         Console.WriteLine("你好, 我叫" + name);
 35     }
 36     public static void sayHiEnglish(string name)
 37     {
 38         Console.WriteLine("hello, my name is {0}, nice to meet you!", name);
 39     }
 40 }
 41
 42
 43
 44 /// <summary>
 45 /// 求任意数组最大值
 46 /// </summary>
 47 class Program
 48 {
 49     public delegate int delCompre(object o1, object o2); //定义比较委托
 50     static void Main(string[] args)
 51     {
 52         //比较int
 53         object[] objs = new object[] { 1, 2, 3, 4, 5, 32, 1, 243, };
 54         var max = getMax(objs, getIntMax); //传入比较int方法
 55         Console.WriteLine(max);
 56
 57         var max2 = getMax(objs, delegate(object o1, object o2)
 58         {
 59             return int.Parse(o1.ToString()) - int.Parse(o2.ToString());
 60         }); //匿名函数 与比较int一样
 61         Console.WriteLine(max2);
 62
 63         //比较string
 64         object[] strs = new object[] { "abc", "efd", "asdf", "sd", "asdff" };
 65         var maxstrs = getMax(strs, delegate(object o1, object o2)
 66         {
 67             return o1.ToString().Length - o2.ToString().Length;
 68         }); //匿名函数
 69         Console.WriteLine(maxstrs);
 70
 71         var maxstrs2 = getMax(strs, (object o1, object o2) =>
 72         {
 73             return o1.ToString().Length - o2.ToString().Length;
 74         }); //lambda 表达式
 75         Console.WriteLine(maxstrs2);
 76
 77         Console.ReadKey();
 78     }
 79
 80     public static int getIntMax(object o1, object o2) //比较int方法
 81     {
 82         int n1 = int.Parse(o1.ToString());
 83         int n2 = int.Parse(o2.ToString());
 84         return n1 - n2;
 85     }
 86     /// <summary>
 87     /// 取一个任意数组的最大值
 88     /// </summary>
 89     /// <param name="objs">数组</param>
 90     /// <param name="del">委托</param>
 91     /// <returns></returns>
 92     public static object getMax(object[] objs, delCompre del)
 93     {
 94         object max = objs[0];
 95         for (int i = 0; i < objs.Length; i++)
 96         {
 97             //if (max < objs[i]) object 无法确定是什么类型 所以不能用<
 98             if (del(max, objs[i]) < 0) //如果委托值小于0 成立 传入如何比较即可
 99             {
100                 max = objs[i];
101             }
102         }
103         return max;
104     }
105 }
106
107
108 /// <summary>
109 /// 泛型<T>委托
110 /// </summary>
111 class Program
112 {
113     public delegate int delCompre<T>(T t1, T t2); //定义泛型委托
114     static void Main(string[] args)
115     {
116         //int
117         int[] nums = { 1, 2, 3, 4, 5 };
118         int max = getMax<int>(nums, (int t1, int t2) => { return t1 - t2; });
119         Console.WriteLine(max);
120
121         //string
122         string[] strs = { "asd", "sdf", "zxcvv", "123", "qwe" };
123         string maxStr = getMax(strs, (string s1, string s2) => { return s1.Length - s2.Length; });
124         Console.WriteLine(maxStr);
125
126         Console.ReadKey();
127     }
128
129     public static T getMax<T>(T[] objs, delCompre<T> del)
130     {
131         T max = objs[0];
132         for (int i = 0; i < objs.Length; i++)
133         {
134             if (del(max, objs[i]) < 0)
135             {
136                 max = objs[i];
137             }
138         }
139         return max;
140     }
141 }

多播委托
注册多个方法,调用时将这些方法依次执行一遍。

1 public delegate void my1();
2
3 my1 my = Fun1();
4 my+= Fun2(); //+=实现多播委托
5
6 public static void Fun1(){
7 }
8 public static void Fun2(){
9 }  

转载于:https://www.cnblogs.com/baidawei/p/4705392.html

4、C#进阶:MD5加密、进程、线程、GDI+、XML、委托相关推荐

  1. iOS进阶之底层原理-线程与进程、gcd

    线程与进程 线程的定义 线程是进程的基本单位,一个进程的所有任务都在线程中执行 进程要想执行任务,必须的有线程,进程至少要有一条线程 程序启动默认会开启一条线程,也就是我们的主线程 进程的定义 进程是 ...

  2. java io 并发编程,JAVA进阶系列 - 并发编程 - 第1篇:进程线程并发并行

    学习目标进程 线程 并发 并行 内容 一.进程与线程 "专业"点的说法就是:进程是资源分配的最小单位,线程是CPU调度的最小单位. 大哥,我错了,别打脸! 进程 线程就是用来加载指 ...

  3. 4.19 python 网络编程和操作系统部分(TCP/UDP/操作系统概念/进程/线程/协程) 学习笔记

    文章目录 1 网络编程概念 1)基本概念 2)应用-最简单的网络通信 2 TCP协议和UDP协议进阶(网络编程) 1)TCP协议和UDP协议基于socket模块实现 2)粘包现象 3)文件上传和下载代 ...

  4. Jmeter Md5加密操作之-------BeanShell PreProcessor

    背景: 有一些登录会做一些md5校验,通过jmeter的BeanShell可以解决MD5加密情况. 1.首先需要一个解码的jar包,commons-codec-1.10.jar(网上很多),下载后,放 ...

  5. qt调用mysql加密接口_Qt实现客户端/服务器端登录验证|数据传输使用md5加密 | 学步园...

    要完成两个模块:客户端和服务器端.即实现通过客户端向远程服务器段发送数据来验证,以此来实现简单的认证功能.同时,客户端在向服务器段发送的数据通过md5加密后再传送. 开发环境与工具 开发操作系统:Wi ...

  6. md5加密工具类_贼好用的 Java 工具类库! GitHub 星标 10k+,你在用吗?

    来源:ryanc.cc/archives/hutool-java-tools-lib 简介 Hutool是Hu + tool的自造词,前者致敬我的"前任公司",后者为工具之意,谐音 ...

  7. Linux的进程/线程/协程系列4:进程知识深入总结:上篇

    Linux的进程/线程/协程系列4:进程/线程相关知识总结 前言 本篇摘要: 1. 进程基础知识 1.1 串行/并行与并发 1.2 临界资源与共享资源 1.3 同步/异步与互斥 1.4 进程控制原语 ...

  8. linux的进程/线程/协程系列5:协程的发展复兴与实现现状

    协程的发展复兴与实现现状 前言 本篇摘要: 1. 协同制的发展史 1.1 协同工作制的提出 1.2 自顶向下,无需协同 1.3 协同式思想的应用 2. 协程的复兴 2.1 高并发带来的问题 2.2 制 ...

  9. linux的进程/线程/协程系列3:查看linux内核源码——vim+ctags/find+grep

    linux的进程/线程/协程系列3:查看linux内核源码--vim+ctags/find+grep 前言 摘要: 1. 下载linux内核源码 2. 打标签方法:vim+ctags 2.1 安装vi ...

最新文章

  1. 艾伟:控件之ViewState
  2. 依图科技再破世界记录!AutoML取代人工调参,刷榜三大权威数据集
  3. 《互联网运营智慧》十一月进展
  4. Scala方法定义及调用
  5. pycharm调试如何返回上一步_如何在瑞芯微RK3399开发板上调用底层接口技术调试笔记...
  6. 用Asp.net写自己的服务框架
  7. linux看配置命令,Linux下命令行查看系统配置
  8. 本次安装visual studio所用的安装程序不完整_阁楼影院安装案例
  9. 好未来AI Lab-文本检测方法分析
  10. 《机电传动控制》学习笔记-07
  11. poj 2754 Similarity of necklaces 2
  12. GEE:快速下载数字高程DEM数据
  13. Gap Locks(间隙锁)
  14. 重置Ubuntu root 密码
  15. Java微服务开发指南-集群管理、失败转移和负载均衡的实践(下)
  16. java.sql.SQLSyntaxErrorException: Table ‘H_PERSION‘ doesn‘t exist
  17. Python 爬虫篇-利用urllib库下载网页中的图片实例演示
  18. 【毛坦厂复读生心中所想】—— 我在大学挺好的【内附学习资源和路线】
  19. JAVA操作xml文件
  20. 计算机中线性结构定义,数据结构基本概念

热门文章

  1. 转:Java反射教程
  2. mysql INFORMATION_SCHEMA COLUMNS 解释
  3. 同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO
  4. 透明的WinForm窗体
  5. VS2005 ASP.NET2.0安装项目的制作(包括数据库创建、站点创建、IIS属性修改、Web.Config文件修改)
  6. 网站漏洞检测针对区块链网站安全分析
  7. 【算法题】Multiples of 3 and 5
  8. 【学神】1-4 用户及用户组管理
  9. 《精彩绝伦的CSS》读书笔记(二)
  10. opencv 在debian6.0下安装