4、C#进阶:MD5加密、进程、线程、GDI+、XML、委托
2015-08-05 17:46
375 查看
MD5加密
将字符串进行加密,无法解密。网上的解密方式也都是在库里找,找不到也没有。
进制
表示某一位置上的数运算时是逢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类
用来操作文件夹的
进程
我们可以把计算机中每一个运行的应用程序当作是一个进程
线程
每一个进程是由多个线程组成的。
单线程:让程序做多件事时,会引发卡死 假死状态。
多线程:让一个程序同时处理多个事情,后台运行程序,提高程序的运行效率。
前台线程:只有所有的前台线程都关闭才能完成程序关闭。(winform多窗口时)
后台线程:只要所有的前台线程结束,后台线程自动结束。
多用于大量数据时,多分一个线程去搜索数据,然后存储到缓存里,页面再用异步获取缓存中的数据。
GDI+
是一种绘图装置接口,可以用来绘制图片。
画直线
画验证码
mvc中调用
前台
XML文件
可扩展标记性语言,用来保存轻量级数据。
XML的标签是成对出现的、并且是区分大小写的。
XML文档必须包含根节点,且只有一个。
创建XML文件
向已有XML文件中追加
获取XML文件
删除XML文件
LinqToXml
委托
使用delegate定义委托,将一个方法作为参数传给另一个方法。
委托所指向的函数必须返回值与参数相同
多播委托
注册多个方法,调用时将这些方法依次执行一遍。
将字符串进行加密,无法解密。网上的解密方式也都是在库里找,找不到也没有。
protected void Page_Load(object sender, EventArgs e) { string s = "123"; Response.Write(getMd5(s)); } public string getMd5(string str) { MD5 md5 = MD5.Create();//MD5抽象类无法实例化 实例化该方法 byte[] buffer = Encoding.Default.GetBytes(str); //将字符串转换为字节数组 byte[] mdbuffer = md5.ComputeHash(buffer); //调用ComputeHash方法把数组传进去 //将字节数组中每个元素ToString(); StringBuilder result = new StringBuilder(); for (int i = 0; i < mdbuffer.Length; i++) { result.Append(mdbuffer[i].ToString("x2")); //ToString得到十进制字符串 ToString("x")十六进制字符串 ToString("x2")对齐 } return result.ToString(); }
进制
表示某一位置上的数运算时是逢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类
用来操作文件夹的
Directory.CreateDirectory("d:/ccc/cc"); //创建文件夹 Directory.Delete("d:/ccc",true); //true删除非空文件夹 Directory.Move(@"d:/ccc", @"d:/cccc"); //剪切操作 源目录没了 必须同一卷轴d盘 string[] s = Directory.GetFiles(@"D:\项目\Web\Images\shiji"); //获得文件夹目录下所有文件全路径 string[] s = Directory.GetFiles(@"D:\项目\Web\Images\shiji","*.jpg"); //获得文件夹目录下指定后缀名文件全路径 string[] s = Directory.GetDirectories(@"D:\项目\Web\Images"); //获得文件夹目录下的文件夹的全路径 Directory.Exists(@"D:\项目\Web\Images") //是否存在某文件夹
进程
我们可以把计算机中每一个运行的应用程序当作是一个进程
///获得当前程序中正在运行的进程 Process[] pros = Process.GetProcesses(); foreach (var item in pros) { //item.Kill(); //关闭所有进程. //item.ProcessName; //进程名 Console.Write(item.ToString()); } //通过进程打开一些程序 Process.Start("calc"); //打开计算器 Process.Start("notepad"); //打开记事本 //打开指定文件 ProcessStartInfo pro = new ProcessStartInfo(@"d:\11.txt"); Process pr = new Process(); pr.StartInfo = pro; pr.Start();
线程
每一个进程是由多个线程组成的。
单线程:让程序做多件事时,会引发卡死 假死状态。
多线程:让一个程序同时处理多个事情,后台运行程序,提高程序的运行效率。
前台线程:只有所有的前台线程都关闭才能完成程序关闭。(winform多窗口时)
后台线程:只要所有的前台线程结束,后台线程自动结束。
//实例化Thread类,并传入一个指向线程所要运行的方法。(这时线程已经产生,但还没有运行) //调用Thread类的Start方法,标记线程可以被CPU执行了,但具体执行事件由CPU决定。 Thread th = new Thread(Test); //创建一个线程去执行这个方法。 th.IsBackground = true; //将线程设置为后台线程,前台关闭后 线程结束。 th.Start(); //标记准备就绪,可以随意被执行,具体什么时候执行由CPU决定。 //在.net下是不允许跨线程访问的。 //有时候需要手动释放线程 关闭时 判断线程是否关闭 if (th != null) { th.Abort(); //结束这个线程 不能再Start() } Thread.Sleep(3000); //睡眠3秒后执行 //线程执行带参数方法 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);
画验证码
/// <summary> /// 字符 /// </summary> /// <param name="len">几位</param> /// <returns></returns> public static string validation(int cd) { var ran = new Random(); int num, tem; string rtuStr = ""; for (int i = 0; i < cd; i++) { num = ran.Next(); if (i % 2 == 1) tem = num % 10 + '0'; //数字 else tem = num % 26 + 'A'; //字母 rtuStr += Convert.ToChar(tem).ToString(); } //写入cookie HttpCookie cookie = new HttpCookie("check"); cookie.Value = rtuStr.ToLower(); HttpContext.Current.Response.Cookies.Add(cookie); return rtuStr; } /// <summary> /// 生成图像 /// </summary> /// <param name="check">字符</param> public static byte[] drawImg(string check) { Bitmap img = new Bitmap(90, 34); var ht = Graphics.FromImage(img); ht.Clear(Color.White); ht.DrawLine(new Pen(Color.SpringGreen), 1, 1, 90, 34); Font font = new Font("微软雅黑", 20, FontStyle.Bold); var jianbian = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Teal, Color.Snow, 2f, true); ht.DrawString(check, font, jianbian, 0, 0); ht.DrawRectangle(new Pen(Color.Aqua), 0, 0, img.Width - 1, img.Height - 1); MemoryStream ms = new MemoryStream(); img.Save(ms, ImageFormat.Jpeg); ht.Dispose(); img.Dispose(); return ms.ToArray(); }
mvc中调用
public ActionResult ShowValidate() { var check = Common.Validate.validation(4); byte[] buffer = Common.Validate.drawImg(check); return File(buffer, "image/jpeg"); }
前台
<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文件
//创建XML对象 XmlDocument doc = new XmlDocument(); //创建文档描述信息 XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null); doc.AppendChild(dec); //创建根节点 XmlElement books = doc.CreateElement("Books"); doc.AppendChild(books); //创建子节点 XmlElement book1 = doc.CreateElement("Book"); books.AppendChild(book1); //将子节点添加到books //给book1子节点追加子节点 XmlElement name1 = doc.CreateElement("Name"); name1.InnerText = "c#"; //赋值 文本值 book1.AppendChild(name1); XmlElement price1 = doc.CreateElement("Price"); price1.InnerXml = "<b>10.0</b>"; //赋值 html标签 book1.AppendChild(price1); XmlElement items = doc.CreateElement("Items"); //给节点增加属性 items.SetAttribute("Name", "c#"); items.SetAttribute("Price", "10.0"); book1.AppendChild(items); doc.Save("Books.xml"); //保存 //创建后 <?xml version="1.0" encoding="utf-8"?> <Books> <Book> <Name>c#</Name> <Price> <b>10.0</b> </Price> <Items Name="c#" Price="10.0" /> </Book> </Books>
向已有XML文件中追加
XmlDocument doc = new XmlDocument(); if (File.Exists("Books.xml")) { doc.Load("Books.xml"); //加载 xml XmlElement books = doc.DocumentElement; //得到根节点 //再建立元素进行追加 }
获取XML文件
XmlDocument doc = new XmlDocument(); doc.Load("Books.xml"); XmlElement books = doc.DocumentElement; XmlNodeList xnl = books.ChildNodes; //得到所有节点 foreach (XmlNode v in xnl) //遍历得到所有节点值 { Console.WriteLine(v.InnerText); } XmlNodeList xnl1 = doc.SelectNodes("Books/Book/Items"); //查找节点列表 foreach (XmlNode node in xnl1) { Console.WriteLine(node.Attributes["Name"].Value); //得到name属性的值 Console.WriteLine(node.Attributes["Price"].Value); //得到price属性的值 }
删除XML文件
XmlDocument doc = new XmlDocument(); doc.Load("Books.xml"); XmlNode xnl = doc.SelectSingleNode("Books/Book"); //查找单一节点 xnl.RemoveAll(); //删除全部 doc.Save("Books.xml"); Console.ReadKey();
LinqToXml
//兼容传统方法创建 XDocument xDoc = new XDocument(); //xDoc.Declaration = new XDeclaration() 默认UTF-8 第一行不需要单独建 XElement xRoot = new XElement("root", "值"); //定义元素 XElement xRoot1 = new XElement("root1"); //定义元素2 xRoot1.Value = "值1"; XAttribute xattr = new XAttribute("Id", "1"); //定义属性 xDoc.Add(xRoot); //统一使用add添加 xRoot.Add(xattr); xDoc.Save(@"d:\linqtoxml.xml"); //真正的linq语法 //F# 函数式编程语言 new XDocument( new XElement("root", new XAttribute("id", "001"), "值") ).Save(@"d:\2.xml"); //链式编程,流水线生产 f1().f2().f3()... //查找xml XDocument xdoc = new XDocument(new XElement("root"));//根节点 xdoc.Root.Add(new XElement("person", new XAttribute("id", "1"), new XAttribute("name", "zhangsan"), new XAttribute("sex", "1") )); //添加子节点 xdoc.Root.Add(new XElement("person", new XAttribute("id", "2"), new XAttribute("name", "lisi"), new XAttribute("sex", "2") )); xdoc.Save(@"d:\2.xml"); <?xml version="1.0" encoding="utf-8"?> <root> <person id="1" name="zhangsan" sex="1" /> <person id="2" name="lisi" sex="2" /> </root> //开始查找、修改、删除 XDocument xdoc = XDocument.Load(@"d:\2.xml"); //加载xml foreach (XElement xlt in xdoc.Root.Elements()) //Root根节点 Elements 元素集合 { if (xlt.Name.LocalName == "person") //Name节点名 LocalName不带命名空间的节点名 { if (xlt.Attribute("id").Value == "1") //判断属性值为1时 { Response.Write(xlt.Attribute("name").Value); //输出name xlt.Attribute("name").Value = "newname"; //修改name xlt.Remove(); //删除此节点 xdoc.Save(@"d:2.xml"); } } } //Linq查询语法 //Descendants()所有子节点 可加某节点下所有节点 var query = from s in xdoc.Descendants() //从集合里找 where s.Name.LocalName == "person" select s; foreach (XElement xlt in query) { Response.Write(xlt.Value); } //Linq方法语法(lambda表达式) foreach (XElement xlt in xdoc.Descendants().Where(s => { if (s.Name.LocalName == "name") { return true; } return false; })) { Response.Write(xlt.Value); }
委托
使用delegate定义委托,将一个方法作为参数传给另一个方法。
委托所指向的函数必须返回值与参数相同
/// <summary> /// 委托语法 /// </summary> class Program { public delegate void delSayhi(string name); //定义委托 static void Main(string[] args) { delSayhi del = new delSayhi(sayHiChinese); //实例化委托调用具体方法 del("san"); //执行 delSayhi del1 = sayHiChinese; //直接赋值方式 del1("si"); //匿名函数 delSayhi del2 = delegate(string name) { Console.WriteLine(name + ",思密达"); }; del2("韩国"); //lambda表达式 ()没参数也要写 => { //方法体 } 没参数可以e=> Console.WriteLine(""); 如果只有一句话不用{} 返回的return可以省略 delSayhi del3 = (string name) => { Console.WriteLine(name + ",萨瓦迪卡"); }; del2("泰国"); sayHi("david", sayHiEnglish); //调用自定义方法 参数要调用的方法 Console.ReadKey(); } public static void sayHi(string name, delSayhi del) //定义方法 类型委托 { del(name); } public static void sayHiChinese(string name) { Console.WriteLine("你好, 我叫" + name); } public static void sayHiEnglish(string name) { Console.WriteLine("hello, my name is {0}, nice to meet you!", name); } } /// <summary> /// 求任意数组最大值 /// </summary> class Program { public delegate int delCompre(object o1, object o2); //定义比较委托 static void Main(string[] args) { //比较int object[] objs = new object[] { 1, 2, 3, 4, 5, 32, 1, 243, }; var max = getMax(objs, getIntMax); //传入比较int方法 Console.WriteLine(max); var max2 = getMax(objs, delegate(object o1, object o2) { return int.Parse(o1.ToString()) - int.Parse(o2.ToString()); }); //匿名函数 与比较int一样 Console.WriteLine(max2); //比较string object[] strs = new object[] { "abc", "efd", "asdf", "sd", "asdff" }; var maxstrs = getMax(strs, delegate(object o1, object o2) { return o1.ToString().Length - o2.ToString().Length; }); //匿名函数 Console.WriteLine(maxstrs); var maxstrs2 = getMax(strs, (object o1, object o2) => { return o1.ToString().Length - o2.ToString().Length; }); //lambda 表达式 Console.WriteLine(maxstrs2); Console.ReadKey(); } public static int getIntMax(object o1, object o2) //比较int方法 { int n1 = int.Parse(o1.ToString()); int n2 = int.Parse(o2.ToString()); return n1 - n2; } /// <summary> /// 取一个任意数组的最大值 /// </summary> /// <param name="objs">数组</param> /// <param name="del">委托</param> /// <returns></returns> public static object getMax(object[] objs, delCompre del) { object max = objs[0]; for (int i = 0; i < objs.Length; i++) { //if (max < objs[i]) object 无法确定是什么类型 所以不能用< if (del(max, objs[i]) < 0) //如果委托值小于0 成立 传入如何比较即可 { max = objs[i]; } } return max; } } /// <summary> /// 泛型<T>委托 /// </summary> class Program { public delegate int delCompre<T>(T t1, T t2); //定义泛型委托 static void Main(string[] args) { //int int[] nums = { 1, 2, 3, 4, 5 }; int max = getMax<int>(nums, (int t1, int t2) => { return t1 - t2; }); Console.WriteLine(max); //string string[] strs = { "asd", "sdf", "zxcvv", "123", "qwe" }; string maxStr = getMax(strs, (string s1, string s2) => { return s1.Length - s2.Length; }); Console.WriteLine(maxStr); Console.ReadKey(); } public static T getMax<T>(T[] objs, delCompre<T> del) { T max = objs[0]; for (int i = 0; i < objs.Length; i++) { if (del(max, objs[i]) < 0) { max = objs[i]; } } return max; } }
多播委托
注册多个方法,调用时将这些方法依次执行一遍。
public delegate void my1(); my1 my = Fun1(); my+= Fun2(); //+=实现多播委托 public static void Fun1(){ } public static void Fun2(){ }
相关文章推荐
- c#高级编程第七版 学习笔记 第三章 对象和类型
- C# 打包安装部署 属性中找不到 查找目标或打开文件位置
- c# 知识总结
- 用C#做成的程序如何打包部署,在其他PC机运行
- C# ref和out参数的使用
- C# 字符串处理
- C#高级编程七十一天----DLR ScriptRuntime
- Directory 类
- C#编程技术层次
- C#关于静态函数与普通函数之间的调用问题,以及可变参数的使用
- C#中的异常处理
- C# int字节 转换Byte数组 3位
- C#实现得到本机IP以及网关地址
- C#设计模式——总结
- C#中变量与对象、类型与类之间的区别
- C# Serializable
- C# 扩展方法集
- WPF(C#)中Bitmap与BitmapImage相互转换
- WPF(C#)中Bitmap与BitmapImage相互转换
- C#接口的作用