你的位置:首页 > ASP.net教程

[ASP.net教程]4、C#进阶:MD5加密、进程、线程、GDI+、XML、委托


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 Conhttp://i.cnblogs.com/EditPosts.aspx?opt=1sole.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(http://i.cnblogs.com/EditPosts.aspx?opt=1);

线程

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

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

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

前台线程:只有所有的前台线程都关闭才能完成程序关闭。(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     else17       tem = num % 26 + 'A'; //字母18     rtuStr += Convert.ToChar(tem).ToString();19   }20   //写入cookie21   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="http://www.cnblogs.com//Login/ShowValidate" id="img" onclick="changeCode()" >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,"");    }  }}

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

创建

 1 //创建 2 new  3 //创建文档描述信息 4 null); 5 doc.AppendChild(dec); 6  7 //创建根节点 8 ); 9 doc.AppendChild(books);10 11 //创建子节点12 );13 books.AppendChild(book1); //将子节点添加到books14 15 //给book1子节点追加子节点16 );17 name1.InnerText = "c#"; //赋值 文本值18 book1.AppendChild(name1);19 20 );21 price1.Inner//赋值 html标签22 book1.AppendChild(price1);23 24 );25 //给节点增加属性26 items.SetAttribute("Name", "c#");27 items.SetAttribute("Price", "10.0");28 book1.AppendChild(items);29 30 doc.Save("Books.//保存31 32 //创建后33 <?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>

向已有

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

获取

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

删除

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

LinqTo

 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:\linqto);15 16 //真正的linq语法17 //F# 函数式编程语言18 new XDocument(19   new XElement("root",20     new XAttribute("id", "001"),21     "值")22   ).Save(@"d:\2.);23 //链式编程,流水线生产 f1().f2().f3()...24 25 //查找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.);38 39 <?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.//加载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); //输出name55       xlt.Attribute("name").Value = "newname"; //修改name56       xlt.Remove(); //删除此节点57       xdoc.Save(@"d:2.);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 }

正则表达式

用于字符串处理、表单验证等。var regx = "^[a-zA-Z0-9]{6,20}$";if ( ! Regex.IsMatch("abcdef;sd123",regex){  //长度必须6-20,字母和数字}^ 匹配一行的开始 例如正则表达式 ^when 能够匹配到 ”when in the“ 的开始,但不能匹配到 ”what and when in the“ $ 匹配一行的结束。 例如正则表达式 food$ 能够匹配到 “he's food” 的末尾 .点 匹配任何单个字符,例如正则表达式 r.t 能够匹配 “rat、rut、r t”,但是不能匹配root * 匹配0或多个正好在它之前的那个字符,例如 .* 能够匹配任意数量的任何字符。 [] 匹配匹配一个出现在[]中的字符 | 或 敏感词 ab|cd|ed|df() 提高优先级 a(bc) 实现分组+ 紧跟在+前面的字符出现任意次,至少1次? 紧跟在?前面的字符出现或不出现{n} {n,} {n,m} 匹配一定范围个数 {1,} 相当与+ {0,} 相当于*\d 代表 [0-9] \D 代表 [^0-9] 非0-9\i 代表 [a-z]\u 代表 [A-Z]\a 代表 [A-Za-z]\w 代表 [a-zA-Z0-9] 常用表达式匹配身份证:\d{15}|\d{18}匹配中国邮政编码:[1-9]\d{5}(?!\d)匹配腾讯QQ号:[1-9][0-9]{4,}匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*匹配首尾空白字符的正则表达式:^\s*|\s*$匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />匹配中文字符的正则表达式: [\u4e00-\u9fa5]限制网页表单里的文本框输入内容:只能输入中文:<input type="text" onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))" />只能输入数字:<input type="text" onkeyup="value=value.replace(/[^\d]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" />只能输入数字和英文:<input type="text" onkeyup="value=value.replace(/[\W]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text).replace(/[^\d]/g,''))" />

委托
使用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 Program112 {113   public delegate int delCompre<T>(T t1, T t2); //定义泛型委托114   static void Main(string[] args)115   {116     //int117     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     //string122     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 }