1、 上学吧 http:/上学吧为您提供程序员(初级)考试资料下载:http:/ f_dw_ZoomWritten by Vial.Z参数: datawindow dw_print 要打印的数据窗口integer nMinZoom 极限缩小比例(缩小范围不能太大,否则不清晰)返回值:-1 error0 找不到合适的值0 找到的合理值作用:纸张大小满足数据窗口的要求,返回 100;当数据窗口宽度太大, 无法在一页纸张上打印时,该程序寻找一个最佳缩小比例值,使得数据窗口的内容恰好能在当前设定的纸张下打印出来。如窗口缩小到 85%可以在一页上打印时 ,返回值为 85-*/ if not IsValid(
2、dw_print) thenreturn -1end ifdw_print.object.datawindow.print.preview = true /*预览模式必须打开*/dw_print.SetRedraw(FALSE) /*调整放大比例过程中, 停止重绘控件,节省程序时间*/string ls_H_Page /*水平打印占据的页数*/string ls_zoom /*设定的缩小百分比整数值 */Integer li_max = 100 /*从百分百大小开始测试 */integer li_min /*极限缩小值, 最多缩小到 nn%*/Integer li_use /*当前测试值 */
3、Integer li_OK = 0 /*最优可用值*/Integer li_count = 0 /*算法循环执行的次数*/li_min = nMinZoom /*赋最小测试值*/li_use = li_max /*从原始大小 (100)开始测试。逐渐缩小放大比例*/do while li_min 100 thendw_print.modify(“datawindow.zoom = 100 “ )end ifdw_print.object.datawindow.print.preview = false dw_print.SetRedraw(TRUE) /*恢复重绘控件*/return li_O
4、K 使用框架跨域运行不丢失 session 的方法首先说明原理:系统是认一个一个程序范围的,一般来说, 一个 IE 默认为一个程序范围.框架因为有了跨域的内容, 所以它首先默认的是框架程序本身的程序范围,这样使得框架内的程序范围得不到确认.为了让这个 IE 默认为框架内的程序范围,所以我使用了多次跳转.首先,跳出本框架 ,进入一个无框架的需要 session 值的网站页面(就叫它 B 服务器的页面), 并在这个页面中生成一个 session 以便系统自动生成一个 sessionID,然后又跳回到有框上学吧 http:/上学吧为您提供程序员(初级)考试资料下载:http:/ IE 生成了一个 s
5、essionID,所以只要不关掉这个 IE,系统一直以为这个 IE 是本程序范围的. 这样,再次生成的 session 值就得以在这个 ID 中生存下来.也就达到了骗过系统的目的.再补充一点, 二次跳转使用了不同的方式, 原因是我需要把框架外的信息丢弃,而要保存框架内的信息.而不同的跳转方式会丢弃或保存跳转前的信息的。程序实现方式:文件 1:框架文件:index.htm(运行在服务器 A 上)奇豪门业此网页使用了框架,但您的浏览器不支持框架。文件 2:index.asp (运行在服务器 B 上,作用跳转和生成 sessionID)if (top.location != self.locatio
6、n) top.location=self.location;/这个 JS 的目的是跳出框架运行经过以上的跳转,本 IE 已经有了服务器 B 上的 sessionID,也就是说,框架虽然是在服务器 A 上的主框架运行,但它可以确保服务器 B 上的 session 不丢失,达到跨域运行的目的。使用 MD5 变换算法防穷举(冲撞)破译密码MD5 是在 Web 应用程序中最常用的密码加密算法。由于 MD5 是不可逆的,因而经过MD5 计算得到后的密文,不能通过逆向算法得到原文。 回顾在 Web 应用程序中使用 MD5 加密文本密码的初衷,就是为了防止数据库中保存的密码不幸泄露后被直接获得。但攻击者不但
7、拥有数据量巨大的密码字典,而且建立了很多 MD5 原文/密文对照数据库,能快速地找到常用密码的 MD5 密文,是破译 MD5 密文的高效途径。然而,MD5 密文数据库所使用的是最常规的 MD5 加密算法:原文MD5密文。因此,我们可以使用变换的 MD5 算法,使现成的 MD5 密文数据库无所作为。 下面演示一些变换算法的例子当然,在其它的 Web 开发语言中,也大同小异,完全能得到相同的结果。 变换一:循环 MD5 最容易理解的变换就是对一个密码进行多次的 MD5 运算。自定义一个函数,它接受$data 和$times 两个形参,第一个是要加密的密码,第二个是重复加密的次数。实现这种变换有两种
8、算法 0) $data = md5($data); $times-; return md5_1_2($data, $times); /实现递归 else return $data; ? 变换二:密文分割 MD5 尽管用户的密码是不确定的字符串,但是只要经过一次 MD5 运算后,就会得到一个由32 个字符组成的字符串,这时可以再针对这个定长字符串变换。有点 BT 的算法是,把这段密文分割成若干段,对每段都进行一次 MD5 运算,然后把这堆密文连成一个超长的字符串,最后再进行一次 MD5 运算,得到仍然是长度为 32 位的密文。 当然,这种密文分割的具体算法是数之不尽的,比如可以把原密文分割成 1
9、6 段每段两字符、8 段每段 4 字符,或者每一段的字符数不相等 变换三:附加字符串干涉 在加密过程的一个步骤中,附加一个内容确定的字符串(比如说用户名) ,干涉被加密的数据。不可以用随机字串,因为这样会使原算法无法重现。这种算法在某些情况下是很具有优势的,比如说用于大量的用户密码加密,可以把用户名作为附加干涉字串,这样攻击者就算知道你的算法,也很难从他们手中的字典中一下子生成海量的对照表,然后大量地破译用户密码,只能有针对性的穷举为数不多的用户。 变换四:大小写变换干涉 由于 PHP 所提供的 md5()函数返回的密文中的英文字母全部都是小写的,因此我们可以把它们全部转为大写,然后再进行一次
10、 MD5 运算。 变换五:字符串次序干涉 把 MD5 运算后的密文字符串的顺序调转后,再进行一次 MD5 运算。 变换六、变换七、变换八 MD5 变换算法是数之不尽的,甚至无须自己再去创造,就用上面的五个互相组合就可以搞出很 BT 的算法。比如说先循环加密后再分割,并在每一段上附加一个字符串再分别加密,然后变换大小写并颠倒字符串顺序后连成一个长字符串再进行 MD5 运算 如果真的很不幸,由于某些漏洞,比如说 SQL Injection 或者文件系统中的数据库被下载而异致用户密码数据暴露,那么 MD5 变换算法就能大大地增加破译出密码原文的难度,首先就是使网上很多的 MD5 原文/密文对照数据库
11、(要知道,这是破译 MD5 最高效的方法)没有用了,然后就是使攻击者用常规算法去穷举一串由变换算法得到的密文而搞得焦头烂额。当然,MD5 变换算法特别适合用于非开源的 Web 程序使用,虽说用在开源的程序中优势会被削弱(大家都知道算法) ,但是也能抑制 MD5 原文/密文对照数据库的作用。要进行这些复杂的变换运算,当然就要花费的更多的系统开销了,然而对于安全性要求很严格的系统来说,多付出一些来换取高一点的安全性,是完全值得的。使用 Java 范型需要注意的地方1、静态方法要想范化,需要指定其类型参数2、非范化类型中的实例方法要想范化,也需要制定其类型参数。3、范化类型中的实力方法可以直接使用其
12、类型本身的类型参数。上学吧 http:/上学吧为您提供程序员(初级)考试资料下载:http:/ List不是 List的子类。5、不能实例化范型类型的数组,即 new List3 是不合法的,提示除非类型参数是一个未绑定的通配符,即 new List3 是合法的。6、构造延迟,在代码编写时我们不能通过类型参数来构造一个该类型的实例,原因是我们不知道如何构造,类型参数的实际类型是在运行时确定的。7、对于注意 5 所描述的问题我们有一个解决方法是 List list = (List) new Object3;但是如果是运行时建立数组呢,类型信息是运行时确定的,那就换种写法T tarray = (T
13、) new Object3;8、上面的数组构造是不被推荐的,最好的方法是将类型信息传递到方法中,如method(Class type) V array = (V)Array.newInstance (type, length) ; ,可以参考 ArrayList 类的 toArray(T a)方法的实现。9、构造通配符引用,如果 set 是一个 Set类型,则 Set set2 = new HashSet(set) ;是不合法的,改成 Set set2 = new HashSet(set) ;就合法了。使用 C#编写查询 IP 段功能的程序本文将通过一个实例来向大家讲解如何使用 C#来编写一个
14、具备查询 IP 段功能的小程序。 主要功能:查询一个 IP 所有的 IP 段.关键:从 Byte 数组到 ulong 的转换出来的数字和 IPAddress.Address 返回值的是不一样的.以下是引用片段:using System; using System.Collections.Generic; using System.Text; using System.Net; namespace IPUtility class Program static void Main(string args) IPRangeManage irm = new IPRangeManage(); irm.A
15、dd(new IPRange(“石家庄“, “219.148.24.0“, “219.148.63.255“); irm.Add(new IPRange(“石家庄“, “222.222.0.0“, “222.222.63.255“); 上学吧 http:/上学吧为您提供程序员(初级)考试资料下载:http:/ IPRange(“唐山“, “219.148.64.0“, “219.148.79.255“); irm.Add(new IPRange(“保定“, “219.148.20.0“, “219.148.23.255“); Console.WriteLine(irm.Search(“219.
16、148.56.3“).Name); Console.ReadLine(); public class IPRange private string _Name = string.Empty; private ulong _BeginIP = 0; private ulong _EndIP = Int32.MaxValue; /*/ / IP 段名称 / public string Name get return _Name; set _Name = value; /*/ / ?始 IP / public ulong BeginIP get return _BeginIP; set _Begin
17、IP = value; /*/ / ?束 IP / public ulong EndIP get return _EndIP; set _EndIP = value; /*/ / 此 IP 段的范? / public ulong Range get return EndIP - BeginIP;上学吧 http:/上学吧为您提供程序员(初级)考试资料下载:http:/ public IPRange(string name, string ipBegin, string ipEnd) this.Name = name; this.BeginIP = IP2A(ipBegin); this.End
18、IP = IP2A(ipEnd); public static ulong IP2A(string ip) byte bytes = IPAddress.Parse(ip).GetAddressBytes(); ulong ret = 0; foreach (byte b in bytes) ret y.Range) return 1; else return -1; public class IPRangeManage public IPRangeManage() private List _IPRangeList = new List(); private bool _NeedSort =
19、 true; public void Add(IPRange ipRange) _IPRangeList.Add(ipRange); _NeedSort = true; private void Sort() if (_NeedSort) 上学吧 http:/上学吧为您提供程序员(初级)考试资料下载:http:/ Comparison(IPRange.Compare); public IPRange Search(string ipString) ulong ip = IPRange.IP2A(ipString); this.Sort(); foreach (IPRange ir in _IP
20、RangeList) if (ir.BeginIP = ip) return ir; return null; 设计模式不是什么很高深的东西,有了这些知识大胆地学习吧。很多人说,看了很多设计模式的文章,为什么就是看不懂呢?我觉得原因可能有两个,第一就是你没有花时间认真看,第二就是看的文章不适合作为切入点。不管学习什么,切入点非常重要,如果切入点不是那么平易近人的话很可能会把你拒之门外,对于初学者来说从实例切入最合适。最好是能碰到自己做过的项目的实例作为切入点,这样你一比较就知道为什么设计模式好了。如果要把设计模式的学习境界分一下级的话,我这么分: 第一重:能看懂设计模式的文章 第二重:能自己写
21、一个设计模式的骨架 第三重:能自己编一个新的运用设计模式的例子 第四重:能在写代码的时候想到似乎有设计模式适合,在翻阅资料后找到了这种设计模式 第五重:在理解项目的需求后就能意识到哪里可以使用哪种设计模式进行优化 第六重:完全掌握了设计模式的精髓,灵活使用各种设计模式以及其变种不管怎么样,多看多做多替换才是学习的办法,别人举例十个都不及自己做一个例子,被动十个原则都不及自己体会出一个原则。每一种设计模式虽然都有一个骨架,但是也不必过于强调这个形式,很多时候根据自己的需求简化一点,改变一点,或者混杂一些其它的设计模式,只要能实现目的了,也是一个不错的选择。很多人会觉得这么多种设计模式没有几种能用
22、得上。我觉得这不是什么问题,用不上那就用不上,这些设计模式是大师经历无数大型项目后的精华,如果能在自己做的一个小项目中用上两三个就很不错了,用上二三十个的项目绝对是怪胎。用不上千万别强求,否则既不利于项目的可维护性又增加了工作量。上学吧 http:/上学吧为您提供程序员(初级)考试资料下载:http:/ 和 B 很相似,有人却觉得 A 和 B 很好区分,但是 B 和 C 却很相似啊。感觉很好区分,说明你看准设计模式的着重点的,感觉一样说明你看到的还是它的形。双胞胎虽然形一样,但是神肯定不一样的,只要认准设计模式解决的问题,就不会看错。 关于本系列文章本来这些内容都是用来进行公司内部每周知识分享
23、活动的,既然有一些内容了,想想不妨就整理一下贴出来吧。也正由于这个原因,文章中的一些例子都基于团队内部成员所能理解的一些项目,可能这些项目对大家来说比较陌生,不过好处是例子相对比较贴近实际一点。本系列一共有 20 篇左右,除了介绍 23 种 GOF 设计模式中常用的一部分之外(一些设计模式的思想在 C#语言中有了更简单的实现,一些设计模式不是很常用)还可能会介绍一些其它有用的设计模式。在这些文章中,我不会过多去说一些理论上的东西,也不会有结构图(这些内容网上到处都是) ,所有的内容都是围绕相对实际例子展开。我想,只有这样才能更快的吸收设计模式的神而不是其形。在看文章的时候建议你结合设计模式一书
24、以及博客园的其它设计模式相关文章一起看,这样才能对设计模式理解的全面和充分一点。每一篇文章都会有以下部分: 意图:抄设计模式一书的,因为意图实在是太重要,所以不得不首先列出。 场景:以一个实际的场景来说明为什么要引入设计模式。使用 C#编写 DES 加密程序的 framework这个例子中演示了如何使用 c#中的加密包进行 DES 算法加密,由于 NGWNET 中带的帮助实在是简单,和没有一样,呵呵,不过大家可以借助这个例子一窥 DES 加密的用法。des_demo.cs 代码如下:using System;using System.Security.Cryptography;using Sy
25、stem.IO;using System.Text;public class EncryptStringDES public static void Main(String args) if (args.Length “, args0);return;/ 使用 UTF8 函数加密输入参数UTF8Encoding utf8Encoding = new UTF8Encoding();byte inputByteArray = utf8Encoding.GetBytes(args0.ToCharArray();上学吧 http:/上学吧为您提供程序员(初级)考试资料下载:http:/ 方式一:调用默
26、认的 DES 实现方法 DES_CSP.DES des = DES.Create();/ 方式二:直接使用 DES_CSP()实现 DES 的实体/DES_CSP DES = new DES_CSP();/ 初始化 DES 加密的密钥和一个随机的、8 比特的初始化向量 (IV)Byte key = 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef;Byte IV = 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef;des.Key = key;des.IV = IV;/ 建立加密流SymmetricStre
27、amEncryptor sse = des.CreateEncryptor();/ 使用 CryptoMemoryStream 方法获取加密过程的输出CryptoMemoryStream cms = new CryptoMemoryStream();/ 将 SymmetricStreamEncryptor 流中的加密数据输出到 CryptoMemoryStream 中sse.SetSink(cms);/ 加密完毕,将结果输出到控制台sse.Write(inputByteArray);sse.CloseStream();/ 获取加密数据byte encryptedData = cms.Data;
28、/ 输出加密后结果Console.WriteLine(“加密结果:“);for (int i = 0; i csc des_demo.csMicrosoft (R) C# Compiler Version 7.00.8905 NGWS runtime 2000.14.1812.10Copyright (C) Microsoft Corp 2000. All rights reserved.上学吧 http:/上学吧为您提供程序员(初级)考试资料下载:http:/ 使用 C#编写 DES 加密程序的 framework加密结果:3D 22 64 C6 57 D1 C4 C3 CF 77 CE 2
29、F D0 E1 78 2A 4D ED 7A A8 83 F9 0E 14 E1 BA 387B 06 41 8D B5 E9 3F 00 0D C3 28 D1 F9 6D 17 4B 6E A7 41 68 40解密后数据:使用 C#编写 DES 加密程序的 framework 使用 ASP 重启服务器大家知道直接使用 ASP 是不能够重启服务器的,这时我们需要制作一个组件来实现功能,ASP 通过这个组件调用系统 API,然后按照不同的重启和关机方式进行操作!下面先说 COM 的制作,在 VB 中新建一工程,当然是 AceiveX dll 的!1)先修改工程属性,在工程属性窗口将工程名称改
30、为 system,在类模块窗口将模块名称改为 contral,保存工程;2)然后添加一个模块,用来声明需要使用的 API 和常数!下面是模块中的内容!Declare Function ExitWindowsEx Lib “user32“ (ByVal uFlags As Long, ByVal dwReserved As Long) As Long3)在类模块中输入下列代码:Public Function reboot(atype As Variant)timport javax.jws. * ;import javax.xml.ws.Endpoint;/* author hecm*/WebS
31、ervice(targetNamespace = “ http:/ “ , serviceName = “ HelloService “ )public class WSProvider/ WebResult(name = “Greetings“) / 自定义该方法返回值在 WSDL 中相关的描述WebMethod(action = “ sayHi “ , operationName = “ sayHi “ )public String sayHi(WebParam(name = “ MyName “ ) String name)return “ Hi, “ + name; / WebPara
32、m 是自定义参数 name 在 WSDL 中相关的描述Oneway / 表明该服务方法是单向的,既没有返回值,也不应该声明检查异常WebMethod(action = “ printSystemTime “ , operationName = “ printSystemTime “ ) / 自定义该方法在 WSDL 中相关的描述public void printTime()System.out.println(System.currentTimeMillis();public static void main(String args)Thread wsPublisher = new Threa
33、d( new WSPublisher();wsPublisher.start();private static class WSPublisher implements Runnablepublic void run()/ 发布 WSProvider 到 http: / localhost:8888/hechangmin/WSProvider 这个地址,之前必须调用 wsgen 命令/ 生成服务类 WSProvider 的支持类,命令如下:/ wsgen -cp . WebServices.WSProvider上学吧 http:/上学吧为您提供程序员(初级)考试资料下载:http:/ new
34、WSProvider();实战 JDK6.0 自带 webservice当然建立对应的包,就不用说了。然后编译文件。进入命令提示符下,进入 classes 目录,运行:wsgen -cp . WebServices.WSProvider可以看到将刚才的 class 生成了几个 java 文件和 class 文件。现在要做的是发布 ws 到 http:/localhost:8888/chinajash/WSProvider而实际上的动作就是:Endpoint.publish(“http:/localhost:8888/chinajash/WSProvider“,new WSProvider();
35、当然直接运行 WSProvider 。然后输入 http:/localhost:8888/JAVA-HE/WSProvider?wsdl就已经查看到生成的 wsdl (webservice 描述语言)。也就是服务端就 OK 了。保持运行。编写一个测试客户端:首先选择项目,右键新建 web 服务客户端。其中 ws url 填入刚才生成的 wsdl 地址:http:/localhost:8888/JAVA-HE/WSProvider?wsdl(实际上:和 wsimport http:/localhost:8888/JAVA-HE/WSProvider?wsdl 一样的效果)产生一个效果:在 cla
36、sses 下 按照 之前指定的名字空间产生的包下(目录结构) 生成了7 个帮助 class。然后我们建立一个包 client 建立测试文件:/* To change this template, choose Tools | Templates* and open the template in the editor.*/package client;import net.blogjava.java_he. * ;/* author hecm*/public class Test public static void main(String args)HelloService hs = new
37、 HelloService();WSProvider ws = hs.getWSProviderPort();System.out.println(ws.sayHi( “ hechangmin “ );ws.printSystemTime();上学吧 http:/上学吧为您提供程序员(初级)考试资料下载:http:/ wsdl 中会严格按照你指定的 url 来访问,比如你指定的 127.0.0.1 那么你用本机 IP 的时候也许并不能顺利访问。实现基于 IDEA 算法的加密工具/*-文件名:idea.c */*- */*-功能: 利用 idea 加密算法实现文件的加密 */*- */*-说明:
38、 */*- 这是利用 IDEA 算法实现的文件加密工具可以在法律允许范围内以非商 */*-业形式自由使用,该程序的所有权利由作者吴真保留 */*- */*-版本号:1.0.0(2002.6) */*- */#include#include#include#include#include#include “idea.h“typedef int INT32;typedef char INT8;typedef unsigned char ULONG8;typedef unsigned short ULONG16;typedef unsigned long ULONG32;#define SUCCES
39、S 0#define FAIL -1#define WZ_COMMEND_NUM 4#define WZUSEHELPNUM 7#define READFILESIZE 512 /*一次从文件中读取多少字节 ,可以根据内存的大小调节*/INT32 file_enc( FILE *readfile, FILE *writefile,ULONG8 *key);/*加密文件*/INT32 file_dec( FILE *readfile, FILE *writefile,ULONG8 *key);/*解密文件*/INT32 hextofile( ULONG8 *buf ,FILE *writefil
40、e, ULONG32 length);/*以 16 进制写入文件*/INT32 encodehex(ULONG8 *tobuf,ULONG8 *frombuf,ULONG32 len);/*16 进制解码*/void wz_printhelp();/*打印帮助*/INT8 *WZ_Commend_Help =上学吧 http:/上学吧为您提供程序员(初级)考试资料下载:http:/ IDEA 的加密解密工具 v1.0 “,/*0*/“追求卓越,勇于创新 “,“-著者 : 吴真- “,“ “;INT8 *WZ_USE_HELP=“输入 5 个参数:“,“t1. 可执行文件名 *.exe“,“t2
41、. 操作类型 1:加密;2:解密;“,“t3. 读出数据的文件名*.txt“,“t4. 写入数据的文件名*.txt“,“t5. 密钥(32 字节)“,“*“;void main(INT32 argc,INT8 *argv)INT8 *FILENAME1,*FILENAME2;FILE *fp, *fp2;ULONG8 key33 = 0 ; /*密钥容器*/if ( argc != 5 )wz_printhelp();return;FILENAME1 = argv2;FILENAME2 = argv3;if (fp= fopen(FILENAME1,“r+b“) = NULL | (fp2 =
42、 fopen(FILENAME2,“w+b“)=NULL)printf(“Cant open filen“);return ;memcpy( key, argv4 , strlen( argv4) );/*取得密钥*/switch( atoi(argv1 )case 1:/*加密操作*/file_enc(fp,fp2,key);printf(“n t IDEA 加密完毕,密文存于%s 文件n“,FILENAME2);break;case 2:/*解密*/file_dec(fp,fp2,key);printf(“nt IDEA 解密完毕,明文存于%s 文件n“,FILENAME2);上学吧 ht
43、tp:/上学吧为您提供程序员(初级)考试资料下载:http:/ 请选择是加密|解密 plese choose encrypt|deencryptn“);break;fclose(fp);fclose(fp2);INT32 hextofile( ULONG8 *buf ,FILE *writefile, ULONG32 length)ULONG32 writelen = 0 ;/*以 16 进制形式写入文件*/while( writelen 0 )/*如果从文件中读出的长度不等于 0,那么肯定有 8 个字节以上的空间文件长度存在最后 8 个字节中 */totalfilelen += filele
44、n;memcpy( for ( i = 0 ; i 0 )/*最后一块有多余的元素*/filelen = fread( sendbuf, sizeof( INT8 ), READFILESIZE*2, readfile );encodehex( readbuf,sendbuf,READFILESIZE);for ( i = 0 ; i GetCount();通过 IShellWindows 接口的方法 Item可以得到每一个实例对象IDispatchPtr spDisp;_variant_t va(i, VT_I4);spDisp = m_spSHWinds-Item(va);然后我们可以判断
45、实例对象是不是属于 IE 浏览器对象,通过下面的语句实现:SHDocVw:IWebBrowser2Ptr spBrowser(spDisp);assert(spBrowser != NULL)在得到了 IE 浏览器对象以后,我们可以调用 IWebBrowser2Ptr 接口的方法来得到当前的文档对象的指针: MSHTML:IHTMLDocument2Ptr spDoc(spBrowser-GetDocument(); 然后我们就可以通过这个接口对这个文档对象进行操作,比如通过 Gettitle 得到文档的标题。 我们在浏览网络的时候,一般总会同时开很多 IE 的实例,如果这些页面都是很好的话,我们可