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); //將字符串轉換為字節(jié)數(shù)組 10 byte[] mdbuffer = md5.ComputeHash(buffer); //調用ComputeHash方法把數(shù)組傳進去 11 //將字節(jié)數(shù)組中每個元素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 }進制
表示某一位置上的數(shù)運算時是逢X進一位。二進制就是逢二進一, 十進制是逢十進一,十六進制是逢十六進一,以此類推.
so:二進制001010101只有0和1計算機中的數(shù)據都是二進制表示,四進制以0、1、2、3四個數(shù)字表示任何實數(shù)。十進制0~9數(shù)字組成,十六進制0~9以及ABCEDF組成(表示十進制數(shù))10~15
ToString的特殊方法
時間:now.ToString("yyyy-MM-dd hh:mm:ss") 年-月-日 時:分:秒 具體可以自定單獨寫f y m d t 意義不同前者都可實現(xiàn)
字符型轉換:int.ToString("n"); 640,000.00; int.ToString("C"); ¥640,000.00; .ToString("x");16進制
Directory類
用來操作文件夾的
1 Directory.CreateDirectory("d:/ccc/cc"); //創(chuàng)建文件夾 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();
線程
每一個進程是由多個線程組成的。
單線程:讓程序做多件事時,會引發(fā)卡死 假死狀態(tài)。
多線程:讓一個程序同時處理多個事情,后臺運行程序,提高程序的運行效率。
前臺線程:只有所有的前臺線程都關閉才能完成程序關閉。(winform多窗口時)
后臺線程:只要所有的前臺線程結束,后臺線程自動結束。
1 //實例化Thread類,并傳入一個指向線程所要運行的方法。(這時線程已經產生,但還沒有運行) 2 //調用Thread類的Start方法,標記線程可以被CPU執(zhí)行了,但具體執(zhí)行事件由CPU決定。 3 Thread th = new Thread(Test); //創(chuàng)建一個線程去執(zhí)行這個方法。 4 th.IsBackground = true; //將線程設置為后臺線程,前臺關閉后 線程結束。 5 th.Start(); //標記準備就緒,可以隨意被執(zhí)行,具體什么時候執(zhí)行由CPU決定。 6 //在.net下是不允許跨線程訪問的。 7 //有時候需要手動釋放線程 關閉時 判斷線程是否關閉 8 if (th != null) 9 { 10 th.Abort(); //結束這個線程 不能再Start() 11 } 12 Thread.Sleep(3000); //睡眠3秒后執(zhí)行 13 //線程執(zhí)行帶參數(shù)方法 14 Thread.Start("123"); object類型參數(shù) 在start后括號寫參數(shù)多用于大量數(shù)據時,多分一個線程去搜索數(shù)據,然后存儲到緩存里,頁面再用異步獲取緩存中的數(shù)據。
GDI+
是一種繪圖裝置接口,可以用來繪制圖片。
畫直線
Graphics g = this.CreateGraphics(); //創(chuàng)建GDI對象 Pen pen = new Pen(Brushes.Yellow); //創(chuàng)建畫筆 Point p1 = new Point(30, 50); //創(chuàng)建兩個點 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'; //數(shù)字 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文件
可擴展標記性語言,用來保存輕量級數(shù)據。
XML的標簽是成對出現(xiàn)的、并且是區(qū)分大小寫的。
XML文檔必須包含根節(jié)點,且只有一個。
創(chuàng)建XML文件
1 //創(chuàng)建XML對象 2 XmlDocument doc = new XmlDocument(); 3 //創(chuàng)建文檔描述信息 4 XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null); 5 doc.AppendChild(dec); 6 7 //創(chuàng)建根節(jié)點 8 XmlElement books = doc.CreateElement("Books"); 9 doc.AppendChild(books); 10 11 //創(chuàng)建子節(jié)點 12 XmlElement book1 = doc.CreateElement("Book"); 13 books.AppendChild(book1); //將子節(jié)點添加到books 14 15 //給book1子節(jié)點追加子節(jié)點 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 //給節(jié)點增加屬性 26 items.SetAttribute("Name", "c#"); 27 items.SetAttribute("Price", "10.0"); 28 book1.AppendChild(items); 29 30 doc.Save("Books.xml"); //保存 31 32 //創(chuàng)建后 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; //得到根節(jié)點 6 //再建立元素進行追加 7 }獲取XML文件
1 XmlDocument doc = new XmlDocument(); 2 doc.Load("Books.xml"); 3 4 XmlElement books = doc.DocumentElement; 5 XmlNodeList xnl = books.ChildNodes; //得到所有節(jié)點 6 7 foreach (XmlNode v in xnl) //遍歷得到所有節(jié)點值 8 { 9 Console.WriteLine(v.InnerText); 10 } 11 12 XmlNodeList xnl1 = doc.SelectNodes("Books/Book/Items"); //查找節(jié)點列表 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"); //查找單一節(jié)點 5 xnl.RemoveAll(); //刪除全部 6 doc.Save("Books.xml"); 7 Console.ReadKey();LinqToXml
1 //兼容傳統(tǒng)方法創(chuàng)建 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); //統(tǒng)一使用add添加 12 xRoot.Add(xattr); 13 14 xDoc.Save(@"d:\linqtoxml.xml"); 15 16 //真正的linq語法 17 //F# 函數(shù)式編程語言 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"));//根節(jié)點 27 xdoc.Root.Add(new XElement("person", 28 new XAttribute("id", "1"), 29 new XAttribute("name", "zhangsan"), 30 new XAttribute("sex", "1") 31 )); //添加子節(jié)點 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根節(jié)點 Elements 元素集合 49 { 50 if (xlt.Name.LocalName == "person") //Name節(jié)點名 LocalName不帶命名空間的節(jié)點名 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(); //刪除此節(jié)點 57 xdoc.Save(@"d:2.xml"); 58 } 59 } 60 } 61 62 //Linq查詢語法 63 //Descendants()所有子節(jié)點 可加某節(jié)點下所有節(jié)點 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定義委托,將一個方法作為參數(shù)傳給另一個方法。
委托所指向的函數(shù)必須返回值與參數(shù)相同
多播委托
注冊多個方法,調用時將這些方法依次執(zhí)行一遍。
轉載于:https://www.cnblogs.com/baidawei/p/4705392.html
總結
以上是生活随笔為你收集整理的4、C#进阶:MD5加密、进程、线程、GDI+、XML、委托的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到别人长白头发是什么意思
- 下一篇: 梦到捡到许多戒指和耳环怎么回事