程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 4、C#進階:MD5加密、進程、線程、GDI+、XML、委托,

4、C#進階:MD5加密、進程、線程、GDI+、XML、委托,

編輯:C#入門知識

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 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(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         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" onclick="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 }

正則表達式

用於字符串處理、表單驗證等。
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 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 }  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved