欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 编程语言 > c# >内容正文

c#

4、c#进阶:md5加密、进程、线程、gdi 、xml、委托 -凯发k8官方网

发布时间:2023/11/29 c# 39 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 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();

线程

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

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

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

前台线程:只有所有的前台线程都关闭才能完成程序关闭。(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 /// 2 /// 字符 3 /// 4 /// 几位 5 /// 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 /// 28 /// 生成图像 29 /// 30 /// 字符 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 }

前台

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 = "10.0"; //赋值 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 34 35 36 c# 37 38 10.0 39 40 41 42

向已有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 40 41 42 43 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 /// 2 /// 委托语法 3 /// 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 /// 45 /// 求任意数组最大值 46 /// 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 /// 87 /// 取一个任意数组的最大值 88 /// 89 /// 数组 90 /// 委托 91 /// 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 /// 109 /// 泛型委托 110 /// 111 class program 112 { 113 public delegate int delcompre(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[] objs, delcompre 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

总结

以上是凯发k8官方网为你收集整理的4、c#进阶:md5加密、进程、线程、gdi 、xml、委托的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图