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 = true; public void Add(IPRange ipRange) _IPRangeList.Add(ipRange); _NeedSort = true; private void Sort() if (_NeedSort)