2023年軟考程序員初級(jí)輔導(dǎo)資料大全_第1頁
2023年軟考程序員初級(jí)輔導(dǎo)資料大全_第2頁
2023年軟考程序員初級(jí)輔導(dǎo)資料大全_第3頁
2023年軟考程序員初級(jí)輔導(dǎo)資料大全_第4頁
2023年軟考程序員初級(jí)輔導(dǎo)資料大全_第5頁
已閱讀5頁,還剩222頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

數(shù)據(jù)窗口自適應(yīng)打印紙張大小

函數(shù)名:f_dw_Zoom

WrittenbyVial.Z

參數(shù):

datawindowdw_print-->要打印I為數(shù)據(jù)窗口

integernMinZoom->極限縮小比例(縮小范圍不能太大,否則不清晰)

返回值:

-1error

0找不到合適口勺值

>0找到"勺合理值

作用:

紙張大小滿足數(shù)據(jù)窗口口勺規(guī)定,返回100;

當(dāng)數(shù)據(jù)窗口寬度太大,元法在一頁紙張上打印時(shí),該程序?qū)ふ乙环N最佳縮小比例值,

使得數(shù)據(jù)窗口口勺內(nèi)容恰好能在目前設(shè)定的J紙張下打卬出來。

如窗口縮小到85%可以在一頁上打印時(shí),返回值為85

*/

ifnotlsValid(dw_print)then

return-1

endif

dw_print.object.datawindoiA/.print.preview=true/*預(yù)覽模式必須打開*/

dw_print.SetRedraw(FALSE)/*調(diào)整放大比例過程中,停止重繪控件,節(jié)省程序時(shí)間*/

stringls_H_Page/*水平打印占據(jù)日勺頁數(shù)*/

stringls_zoom/*設(shè)定的縮小比例整數(shù)值*/

Integerli_max=100/*從白,分百大小開始測(cè)試*/

integerli_min/*極限縮小值,最多縮小到nn%*/

Integerli_use/*目前測(cè)試值*/

Integerli_OK=0/*最優(yōu)可用值*/

Integerli_count=0/*算法循環(huán)執(zhí)行H勺次數(shù)*/

li_min=nMinZoom產(chǎn)賦最小測(cè)試值*/

li.use=li_max/*從原始大小(100)開始測(cè)試。逐漸縮小放大比例*/

dowhileli_min<=li_max

li_count++

/*調(diào)整zoom值,并測(cè)試目前寬度打印時(shí)橫向所占的面數(shù)*/

ls_zoom=string(li_use)

dw_print.modify("datawindow.zoom="+ls_zoom)

ls_H_Page=dw_print.describe(

evaluate('PageCountAcrossi)',"+string(dw_print.object.datawindow.firstrowonpage)+")")

iflnteger(ls_H_Page)=1then/*一頁足以打印出來*/

li_OK=li_use/*記錄這個(gè)可用的縮小比例*/

li_min=li_use+1

else

li_max=li_use-1

endif

choosecaselimax-limin

caseIS<0

exit

case0

li_use=li_min

case1

li_use=li_min

caseelse

li_use=lnt((li_max+li_min)/2)/*不不小于等于的I最小整數(shù)*/

endchoose

loop

/*還原窗口原大小*/

ifli_OK<>lOOthen

dw_print.modify("datawindow.zoom=100")

endif

dw_print.object.datawindo^.print.preview=false

dw_print.SetRedraw(TRUE)/*恢復(fù)重繪控件*/

returnli_OK

使用框架跨域運(yùn)行不丟失session的措施

首先闡叨原理:

系統(tǒng)是認(rèn)一種一種程序范圍H勺,一般來說,一種IE默認(rèn)為一種程序范圍.

框架由于有了跨域的內(nèi)容,因此它首先默認(rèn)的是框架程序自身的程序范圍,這樣使得框架

內(nèi)的程序范圍得不到確認(rèn).

為了讓這個(gè)IE默認(rèn)為框架內(nèi)日勺程序范圍,因此我使用了多次跳轉(zhuǎn).

首先,跳出本框架,進(jìn)入?種無框架的需要session值的網(wǎng)站頁面(就叫它B服務(wù)器的頁面),

并在這個(gè)頁面中生成一種session以便系統(tǒng)自動(dòng)生成一種session。然后乂跳|可到有框架H勺頁

面.由于系統(tǒng)已經(jīng)為這個(gè)IE生成了一種session。因此只要不關(guān)掉這個(gè)IE,系統(tǒng)一直認(rèn)為這個(gè)IE

是本程序范圍H勺.這樣,再次生成的session值就得以在這個(gè)ID中生存下來.

也就到達(dá)了騙過系統(tǒng)的目的.

再補(bǔ)充?點(diǎn),二次跳轉(zhuǎn)使用了不一樣的方式,原因是我需要把框架外的信息丟棄,而要保

留框架內(nèi)的信息.

而不-?樣H勺跳轉(zhuǎn)方式會(huì)丟棄或保留跳轉(zhuǎn)前的信息日勺。

程序?qū)崿F(xiàn)方式:

文獻(xiàn)1:

框架文獻(xiàn):index.htm(運(yùn)行在服務(wù)器A±)

<html>

<head>

<metaHTTP-EQUIV="Content-Type"CONTENT="text/html;charset=gb2312">

奇豪l'】業(yè)</title>

</head>

<framesetrows="l,*"border=0frameborder="0">

<framename="winBackLoad"scrolling="no"noresizetarget="mainwebl"

src="default_top.htm">

<framename="mainwebl"src=""scrolling="auto">

<noframes>

<body>

<p>此網(wǎng)頁使用了框架,但您的J瀏覽器不支持框架。</p>

</body>

</noframes>

</frameset>

</html>

文獻(xiàn)2:index.asp(運(yùn)行在服務(wù)器B上,作用跳轉(zhuǎn)和生成sessionlD)

<script>

if(top.location!==self.location){

top.location=self.location;

)

〃這個(gè)JSH勺目口勺是跳出框架運(yùn)行

</script>

<%

ifsession("xm2")=,H,then

session("xm2")="eee”

'上面這一句日勺目H勺只是為了使用session,讓系統(tǒng)為這個(gè)IE生成一種sessionlD,并且判斷

一下是不是已經(jīng)跳轉(zhuǎn)過,省得引起死循環(huán)。

%>

<METAHTTP-EQUIV=REFRESHCONTENT="0;URL=',">

<%

,上面這一句是回到框架,注意:只能用上面這個(gè)跳轉(zhuǎn)口勺措施,別用下面的跳轉(zhuǎn)措施。

else

Response.Redirect"index2.asp"

'上面一句才是真正地跳轉(zhuǎn)運(yùn)行服務(wù)器B上的程序!注意:也只能用這措施跳!

endif%>

通過以上日勺跳轉(zhuǎn),本IE已經(jīng)有了服務(wù)器B上日勺session。也就是說,框架雖然是在服務(wù)

器A上的主框架運(yùn)行,但士可以保證服務(wù)器B上的session不丟失,到達(dá)跨域運(yùn)行的目的。

使用MD5變換算法防窮舉(沖撞)破譯密碼

MD5是在Web應(yīng)用程序中最常用時(shí)密碼加密算法。由于MD5是不可逆的,因而通過MD5

計(jì)算得到后的I密文,不能通過逆向算法得到原文。

回憶在Web應(yīng)用程序中使用MD5加密文本密碼的初衷,就是為了防止數(shù)據(jù)庫中保留口勺

密碼不幸泄露后被直接獲得。但襲擊者不僅擁有數(shù)據(jù)量巨大口勺密碼字典,并且建立了諸多

MD5原文/密文對(duì)照數(shù)據(jù)庫,能迅速地找到常用密碼的MD5密文,是破譯MD5密文的高效

途徑。然而,MD5密文數(shù)據(jù)庫所使用臥J是最常規(guī)於JMD5加密算法:原文->MD5-->密文。因

此,我們可以使用變換H勺MD5算法,使現(xiàn)成的MD5密文數(shù)據(jù)庫無所作為。

下面演示某些變換算法的例子((((((((當(dāng)然,在其他日勺Web開發(fā)語言中,也大同小異,完

全能得到相似口勺成果。

變換一:循環(huán)MD5

最輕易理解的變換就是對(duì)一種密碼進(jìn)行多次H勺MD5運(yùn)算。自定義一種函數(shù),它接受

$data和$1由05兩個(gè)形參,第一種是要加密的密碼,第二個(gè)是反復(fù)加密的次數(shù)。實(shí)現(xiàn)這種變換

有兩種算法

<?php

〃迭代算法

functionmd5_l_l($data,$times=32)

(

〃循環(huán)使用MD5

for($i=0;$i<$times;$i++){

$data=md5($data);

)

return$data;

〃遞歸算法

functionmd5_l_2($data,$times=32)

if($times>0){

$data=md5($data);

$times-;

returnmd5_l_2($data,$times);〃實(shí)現(xiàn)遞歸

}else{

return$data;

)

)

?>

變換二:密文分割MD5

盡管顧客口勺密碼是不確定日勺字符串,不過只要通過一次MD5運(yùn)算后,就會(huì)得到一種由

32個(gè)字符構(gòu)成H勺字符串,這時(shí)可以再針對(duì)這個(gè)定長字符串變換。有點(diǎn)BT的算法是,把這段

密文分割成若干段,對(duì)每段都進(jìn)行一次MD5運(yùn)算,然后把這堆密文連成一種超長的字符串,

最終再進(jìn)行一次MD5運(yùn)算,得到仍然是長度為32位的密文。

<?php

〃把密文分割成兩段,每段16個(gè)字符

functionmd5_2_l($data)

(

〃先把密碼加密成長度為32字符的密文

$data=md5($data);

〃把密碼分割成兩段

$left=substr($data,0,16);

$right=substr($data,16,16);

〃分別加密后再合并

$data=md5($left).md5($right);

〃最終把長字串再加密一次,成為32字符密文

returnmd5($data);

)

〃把密文分割成32段,每段1個(gè)字符

functionmd5_2_2($data)

(

$data=md5($data);

〃循環(huán)地截取密文中H勺每個(gè)字符并進(jìn)行加密、連接

for($i=0;$i<32;$i++){

$data.=md5($data{$i});

)

〃這時(shí)$data長度為1024個(gè)字符,再進(jìn)行一次MD5運(yùn)算

returnmd5($data);

)

當(dāng)然,這種密文分割的詳細(xì)算法是數(shù)之不盡的,例如可以把

原密文分割成16段每段兩字符、8段每段4字符,或者每一

段的字符數(shù)不相等……

變換三:附加字符串干涉

在加密過程的一種環(huán)節(jié)中,附加一種內(nèi)容確定的字符串

(例如說顧客名),干涉被加密的數(shù)據(jù)。不可以用隨機(jī)字串,

由于這樣會(huì)使原算法無法重現(xiàn)。這種算法在某些狀況下是很

具有優(yōu)勢(shì)的,例如說用于大量的顧客密碼加密,可以把顧客

名作為附加干涉字串,這樣襲擊者就算懂得你的算法,也很

難從他們手中的字典中一下子生成海量的對(duì)照表,然后大量

地破譯顧客密碼,只能有針對(duì)性的窮舉為數(shù)不多的顧客。

<?php

〃附加字符串在原數(shù)據(jù)的尾部

functionmd5_3_l($data,$append)

(

returnmd5($data.$append);

)

〃附加字符串在原數(shù)據(jù)的頭部

functionmd5_3_2($data,Sappend)

returnmd5($append.$data);

)

//附加字符串在原數(shù)據(jù)的頭尾

functionmd5_3_3($data,$append)

(

returnmd5($append.$data.$append);

)

?>

變換四:大小寫變換干涉

由于PHP所提供的md5()函數(shù)返回時(shí)密文中的英文字

母所有都是小寫的,因此我們可以把它們所有轉(zhuǎn)為大寫,然

后再進(jìn)行一次MD5運(yùn)算。

<?php

functionmd5_4($data)

(

〃先得到密碼的密文

$data=md5($data);

〃再把密文中的英文母所有轉(zhuǎn)為大寫

$data=strtotime($data);

〃最終再進(jìn)行一次MD5運(yùn)算并返回

returnmd5($data);

)

?>

變換五:字符串次序干涉

把MD5運(yùn)算后的密文字符串的次序調(diào)轉(zhuǎn)后,再進(jìn)行一

次MD5運(yùn)算。

<?php

functionmd5_5($data)

{

〃得到數(shù)據(jù)的密文

$data=md5($data);

〃再把密文字符串的I字符次序調(diào)轉(zhuǎn)

$data=strrev($data);

〃最終再進(jìn)行一次MD5運(yùn)算并返回

returnmd5($data);

)

?>

變換六、變換七、變換八……

MD5變換算法是數(shù)之不盡的,甚至不必自己再去發(fā)明,

就用上面的五個(gè)互相組合就可以搞出很BT的算法。例如說

先循環(huán)加密后再分割,并在每一段上附加一種字符串再分別

加密,然后變換大小寫并顛倒字符串次序后連成一種長字符

串再進(jìn)行MD5運(yùn)算……

假如真的很不幸,由于某些漏洞,例如說SQLInjection

或者文獻(xiàn)系統(tǒng)中的數(shù)據(jù)庫被下載而異致顧客密碼數(shù)據(jù)暴露,

那么MD5變換算法就能大大地增長破譯出密碼原文的難度,

首先就是使網(wǎng)上諸多的MD5原文/密文對(duì)照數(shù)據(jù)庫(要懂得,

這是破譯MD5最高效的措施)沒有用了,然后就是使襲擊

者用常規(guī)算法去窮舉一串由變換算法得到的密文而搞得焦

頭爛額。當(dāng)然,MD5變換算法尤其合用于非開源的Web程序

使用,雖說用在開源的程序中優(yōu)勢(shì)會(huì)被減弱(大家都懂得算

法),不過也能克制MD5原文/密文對(duì)照數(shù)據(jù)庫的作用。要

進(jìn)行這些復(fù)雜的變換運(yùn)算,當(dāng)然就要花費(fèi)的更多的系統(tǒng)開銷

了,然而對(duì)于安全性規(guī)定很嚴(yán)格的系統(tǒng)來說,多付出某些來

換取高一點(diǎn)的安全性,是完全值得的。

使用Java范型需要注意的地方

1.靜態(tài)措施要想范化,需要指定其類型參數(shù)

2、非范化類型中II勺實(shí)例措施要想范化,也需要制定其類型參數(shù)。

3.范化類型中"勺實(shí)力措施可以直接使用其類型自身II勺類型參數(shù)。

4.范型不是協(xié)變U勺,即List<Integer〉不是List<Number>lft子類。

5、不能實(shí)例化范型類型的數(shù)組,即newList<String>[3]是不合法的,提醒除非類型參數(shù)是一

種未綁定的通配符,即newListv?>[3]是合法W、J。

6.構(gòu)造延遲,在代碼編寫時(shí)我們不能通過類型參數(shù)來構(gòu)造一種該類型的實(shí)例,原因是我們不

懂得怎樣構(gòu)造,類型參數(shù)的實(shí)際類型是在運(yùn)行時(shí)確定的。

7、對(duì)于注意5所描述的問題我們有一種處理措施是List<String>list=(List<String>[])new

Objects;不過假如是運(yùn)行時(shí)建立數(shù)組呢,類型信息是運(yùn)行時(shí)確定口勺,那就換種寫法T[]

tarray=(T口)newObject[3];

8、上面的數(shù)組構(gòu)造是不被推薦的,最佳H勺措施是將類型信息傳遞到措施中,如method

(Class<V>type){V[]array=(V[])Array.newlnstance(type,length);},可以參照ArrayList

類的JtoArray(T[]a)措施日勺實(shí)現(xiàn)。

9、構(gòu)造通配符引用,假如set是一種Setv?>類型,則

Set<?>set2=newHashSet<?>(set);是不合法的L改

成Set<?>set2=newHashSet<Object>(set);就合法了。

使用C#編寫查詢IP段功能的程序

本文將通過一種實(shí)例來向大家講解怎樣使用c#來編寫一種具有查詢IP段功能的小程序。

重要功能:查詢一種IP所有的IP段.

關(guān)鍵:從Byte數(shù)組到ulong時(shí)轉(zhuǎn)換出來日勺數(shù)字和IPAddress.Address返回值的是不一樣樣

H勺.

如下是引用片段:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Net;

namespaceIPUtility

(

classProgram

(

staticvoidMain(stringJargs)

(

IPRangeManageirm=newIPRangeManage();

,,

irm.Add(newIPRange("^^J$","55"));

irm.Add(newIPRange("石家莊",”",“55”));

irm.Add(newIPRangefWllj","","55"));

irm.Add(newIPRange(“保定","”,”55"));

Console.WriteLine(irmSearch("").Name);

Console.ReadLine();

}

)

publicclassIPRange

(

privatestringName=string.Empty;

privateulong_BeginlP=0;

privateulong_EndlP=lnt32.MaxValue;

/**////

〃/IP段名稱

///

publicstringName

(

get{return_Name;}

set{_Name=value;}

}

/**////

III?始IP

III

publiculongBeginIP

(

get{return_BeginlP;}

set{_BeginlP=value;}

)

/**////

III?束IP

///

publiculongEndIP

(

get{return_EndlP;}

set{_EndlP=value;}

)

/**////

〃/此中段的范?

III

publiculongRange

(

get

(

returnEndIP-BeginIP;

}

)

publicIPRangefstringname,stringipBegin,stringipEnd)

(

this.Name=name;

this.BeginIP=IP2A(ipBegin);

this.EndlP=IP2A(ipEnd);

)

publicstaticulongIP2A(stringip)

byte[]bytes=IPAddress.Parse(ip).GetAddressBytes();

ulongret=0;

foreach(bytebinbytes)

(

ret?=8;

ret|=b;

)

returnret;

)

publicstaticintCompare(IPRangex,IPRangey)

(

if(x.Range==y.Range)

return0;

elseif(x.Range>y.Range)

return1;

elsereturn-1;

)

}

publicclassIPRangeManage

(

publicIPRangeManage()

()

privateList<IPRange>_IPRangeList=newList<IPRange>();

privatebool_NeedSort=true;

publicvoidAdd(IPRangeipRange)

(

JPRangeList.Add(ipRange);

_NeedSort=true;

)

privatevoidSort()

(

if(_NeedSort)

(

_IPRangeList.Sort(newComparison(IPRange.Compare));

)

)

publicIPRangeSearch(stringipString)

(

ulongip=IPRange.IP2A(ipString);

this.Sort();

foreach(IPRangeirinJPRangeList)

(

if(ir.BeginIP<=ip&&ir.EndIP>=ip)

(

returnir;

)

)

returnnull;

)

}

)

設(shè)計(jì)模式不是什么很高深藥東西,有了這些知識(shí)大膽地學(xué)習(xí)吧。諸多人說,看了諸多設(shè)計(jì)模

式的文章,為何就是看不懂呢?我覺得原因也許有兩個(gè),第一就是你沒有花時(shí)間認(rèn)真看,

笫二就是看的文章不適合作為切入點(diǎn)。不管學(xué)習(xí)什么,切入點(diǎn)非常重要,假如切入點(diǎn)不是那

么平易近人的話很也許會(huì)把你拒之門外,對(duì)于初學(xué)者來說從實(shí)例切入最合適。最佳是能碰到

自己做過的項(xiàng)目的實(shí)例作為切入點(diǎn),這樣你一比較就懂得為何設(shè)計(jì)模式好了。

假如要把設(shè)計(jì)模式口勺學(xué)習(xí)境界分一下級(jí)的話,我這樣分:

??第一重????能看懂設(shè)計(jì)模式的文章

??第二重????能自己寫一種設(shè)計(jì)模式H勺骨架

??笫三重????能自己編一種新的運(yùn)用設(shè)計(jì)模式的例子

??第四重:能在寫代碼的時(shí)候想到似乎有設(shè)計(jì)模式適合??在翻閱資料后找到了這種

設(shè)計(jì)模式

??第五重????在理解項(xiàng)目的需求后就能意識(shí)到哪里可以使用哪種設(shè)計(jì)模式進(jìn)行優(yōu)化

??第六重:完全掌握了設(shè)計(jì)模式日勺精髓??靈活使用多種設(shè)計(jì)模式以及其變種

不管怎么樣,多看多做多替代才是學(xué)習(xí)日勺措施,他人舉例十個(gè)都不及自己做一種例子,被動(dòng)

十個(gè)原則都不及自己體會(huì)出一種原則。每一種設(shè)計(jì)模式雖然均有一種骨架,不過也不必過于

強(qiáng)調(diào)這個(gè)形式,諸多時(shí)候根據(jù)自己的需求簡(jiǎn)化?點(diǎn),變化?點(diǎn),或者混雜某些其他的設(shè)計(jì)模

式,只要能實(shí)現(xiàn)目的I了,也是一種不錯(cuò)的選擇。

諸多人會(huì)覺得這樣多種設(shè)計(jì)模式?jīng)]有幾種能用得上。我覺得這不是什么問題,用不上那就用

不上,這些設(shè)計(jì)模式是大師經(jīng)歷無數(shù)大型項(xiàng)目后的精摘,假如能在自己做的一種小項(xiàng)目中用

上兩三個(gè)就很不錯(cuò)了,用上二三十個(gè)的項(xiàng)目絕對(duì)是怪胎。用不上千萬別強(qiáng)求,否則既不利于

項(xiàng)目的可維護(hù)性又增長了工作量。

尚有諸多人會(huì)覺得這些設(shè)計(jì)模式諸多都是相似的。并且每個(gè)人H勺感覺還不?樣樣,有人覺得

A和B很相似,有人卻覺得A和B很好辨別,不過B和C卻很相似啊。感覺很好辨別,闡明

你看準(zhǔn)設(shè)計(jì)模式日勺著重點(diǎn)的,感覺同樣闡明你看到日勺還是它的形。雙胞胎雖然形同樣,不過

神肯定不一樣樣H勺,只要認(rèn)準(zhǔn)設(shè)計(jì)模式處理H勺問題,就不會(huì)看錯(cuò)。

有關(guān)本系列文章

本來這些內(nèi)容都是用來進(jìn)行企業(yè)內(nèi)部每周知識(shí)分享活動(dòng)叢J,既然有某些內(nèi)容了,想想不妨就

整頓一下貼出來吧。也正由于這個(gè)原因,文章中的某些例子都基于團(tuán)體內(nèi)部組員所能理解11勺

某些項(xiàng)目,也許這些項(xiàng)目對(duì)大家來說比較陌生,不過好處是例子相對(duì)比較貼近實(shí)際一點(diǎn)。本

系列一共有20篇左右,除了簡(jiǎn)介23種GOF設(shè)計(jì)模式中常用的一部分之外(某些設(shè)計(jì)模式的

思想在C#語言中有了更簡(jiǎn)樸的實(shí)現(xiàn),某些設(shè)計(jì)模式不是很常用)還也許會(huì)簡(jiǎn)介某些其他有用

的設(shè)計(jì)模式。在這些文章中,我不會(huì)過多去說某些理論上的東西,也不會(huì)有構(gòu)造圖(這些內(nèi)

容網(wǎng)上到處都是),所有的內(nèi)容都是圍繞相對(duì)實(shí)際例子展開。我想,只有這樣才能更快H勺吸

取設(shè)計(jì)模式日勺神而不是其形。在看文章的時(shí)候提議你結(jié)合《設(shè)計(jì)模式》一書以及博客園日勺其

他設(shè)計(jì)模式有關(guān)文章一起看,這樣才能對(duì)設(shè)計(jì)模式理解的全面和充足一點(diǎn)。

每一篇文章都會(huì)有如卜部分:

??意圖:抄設(shè)計(jì)模式一書啊??由于意圖實(shí)在是太重

要??因此不得不首先列出。??

??場(chǎng)景????以一種實(shí)際的場(chǎng)景來闡明為何要引入設(shè)

計(jì)模式。

使用C#編寫DES加密程序的framework

這個(gè)例子中演示了怎樣使用C#中的加密包進(jìn)行DES算法加密,由于NGWNET中帶的協(xié)助實(shí)

在是簡(jiǎn)樸,和沒有同樣,呵呵,不過大家可以借助這個(gè)例子一窺DES加密的使用方法。

des_demo.cs代碼如下:

usingSystem;

usingSystem.Security.Cryptography;

usingSystem.10;

usingSystem.Text;

publicclassEncryptStringDES{

publicstaticvoidMain(String[]args){

if(args.Length<1){

Console.WriteLinef'Usage:des_demo<string-to-encrypt>"/args[0]);

return;

)

〃使用UTF8函數(shù)加密輸入?yún)?shù)

UTF8Encodingutf8Encoding=newUTF8Encoding();

byte[]inputByteArray=utf8Encoding.GetBytes(args[0].ToCharArray());

//方式■:調(diào)用默認(rèn)的DES實(shí)現(xiàn)措施DES_CSP.

DESdes=DES.Create();

//方式二:直接使用DES_CSP()實(shí)現(xiàn)DES的實(shí)體

//DES_CSPDES=newDES_CSP();

//初始化DES加密的密鑰和一種隨機(jī)的、8比特的初始化向量(IV)

Byte[]key={0x01,0x23,0x45,0x67,0x89,Oxab,Oxcd,Oxef};

Byte[]IV={0x12,0x34,0x56,0x78,0x90zOxab,OxcdzOxef};

des.Key=key;

des.IV=IV;

//建立加密流

SymmetricStreamEncryptorsse=des.CreateEncryptor(|;

〃使用CryptoMemoryStream措施獲取加密過程日勺輸出

CryptoMemoryStreamcms=newCryptoMemoryStream();

//將SymmetricStreamEncryptor?流中Mj加密數(shù)據(jù)輸出到CryptoMemoryStream中

sse.SetSink(cms);

//加密完畢,將成果輸出到控制臺(tái)

sse.Write(inputByteArray);

sse.CloseStream();

//獲取加密數(shù)據(jù)

byte[]encryptedData=cms.Data;

//輸出加密后成果

Console.WriteLine("加密成果:");

for(inti=0;i<encryptedData.Length;i++){

Console.Write("{0:X2}\encryptedData[i]);

)

Console.WriteLine();

〃上面演示了怎樣進(jìn)行加密,下面演示怎樣進(jìn)行解密

SymmetricStreamDecryptorssd=des.CreateDecryptori);

cms=newCryptoMemoryStream();

ssd.SetSink(cms);

ssd.Write(encryptedDcta);

ssd.CloseStream();

byte[]decryptedData=cms.Data;

char[]decryptedCharArray=utf8Encoding.GetChars(decryptedData);

Console.WriteLine("解密后數(shù)據(jù):");

Console.Write(decryptedCharArray);

Console.WriteLine();

)

}

編譯:

D:\csharp>cscdes_demo.cs

Microsoft(R)C#CompilerVersion7.00.8905(NGWSruntime.14.1812.10]

Copyright(C)MicrosoftCorp.Allrightsreserved.

運(yùn)行實(shí)例:

D:\csharpxJes_demo.exe使用C#編寫DES加密程序J、Jframework

加密成果:

3D2264C657DIC4C3CF77CE2FDOEl782A4DED7AA883F9OE14ElBA38

7B06418DB5E93F000DC328DIF96D174B6EA7416840

解密后數(shù)據(jù):

使用C#編寫DES加密程序的framework

使用ASP重啟服務(wù)器

大家懂得直接使用ASP是不可以重啟服務(wù)器H勺,這時(shí)我們需要制作?種組件來實(shí)現(xiàn)功能,

ASP通過這個(gè)組件調(diào)用系統(tǒng)API,然后按照不一樣H勺重啟和關(guān)機(jī)方式進(jìn)行操作!

下面先說COMH勺制作,在VB中新建一工程,當(dāng)然是AceiveXdll的!

1)先修改工程屬性,生工程屬性窗口將工程名稱改為system,在類模塊窗口將模塊名

稱改為contral,保留工程;

2)然后添加一種模塊,用米申明需要使用的API和常數(shù)!下面是模塊中的內(nèi)容!

DeclareFunctionExitWindowsExLib"user32"(ByVaiuFlagsAsLong,ByVaidwReservedAs

Long)AsLong

3)在類模塊中輸入下列代碼:

PublicFunctionreboot(atypeAsVariant)

t&=ExitWindowsEx(l,atype)

EndFunction

該函數(shù)需要傳入一種參數(shù),用來控制啟動(dòng)方式,這個(gè)參數(shù)是從ASP程序中傳入於J,等一下

就可以看到詳細(xì)U勺使用措施!

編寫完上面的代碼,保留工程,將工程編譯為system.dll。下面就寫ASP程序!

ASP中的代碼非常簡(jiǎn)樸:

<%

atype=request("atype")

setsys=server.CreateObject("system.contral")

sys.reboot(atype)

%>

其中atype可以使用0、1、2、4,0、1和4均為關(guān)機(jī),2用來重啟。寫完后執(zhí)行ASP就

可以了!

JAVA6.0之后,其中JDK自帶有個(gè)輕量級(jí)/、Jwebservice服務(wù)器。假如你比較細(xì)心一定發(fā)

目前你安裝javaII勺途徑下,有javawebserviceI向示例代碼。

java開發(fā)過webservice,不過當(dāng)時(shí)用了一種叩acheFaxis開源項(xiàng)目。假如axis夜進(jìn)化

了,不過java自帶有何須舍近求遠(yuǎn)呢。最簡(jiǎn)樸javawebservice范例過程記錄下來,

netbeans6,首先建立一種java應(yīng)用程序工程,名為

WebServiceso建立一種服務(wù)端程序。

packageWebServices;

importjavax.jws.*;

importjavax.xmLws.Endpoint

/**

*@authorhecm

V

@WebService(targetNamespace="",

serviceName="HelloService")

publicclassWSProvider

(

//@WebResult(name="Greetings'1)//自定義該措

施返回值在WSDL中有關(guān)的描述

@WebMethod(action=nsayHin,operationName="

sayHin)

publicStringsayHi(@WebParam(name="MyName

")Stringname)

return“HiJ+name;//@WebParam是自定義參數(shù)

name在WSDL中有關(guān)的描述

@Oneway//表明該服務(wù)措施是單向陶既沒有返回值,

也不應(yīng)當(dāng)申明檢查異常

@WebMethod(action="printSystemTime\

operationName="printSystemTime")

〃自定義該措施在WSDL中有關(guān)的描述

publicvoidprintTime()

(

System.out.println(System.currentTimeMillis());

)

publicstaticvoidmain(String[]args)

(

ThreadwsPublisher=newThread(new

WSPublisherQ);

wsPublisher.start。;

)

privatestaticclassWSPublisherimplements

Runnable

(

publicvoidrun()

(

//公布WSProvider到http://

tocalhost8888/hechangmin/WSProvider這個(gè)地址>之前

必須調(diào)用wsgen命令

//生成服務(wù)類WSProvider的支持類,命令如下:

//wsgen-cp.WebServices.WSProvider

Endpoint.publish(Mhttp://tocalhost8888/JAVA-HE/WSPr

ovidern,newWSProviderQ);

)

)

實(shí)戰(zhàn)JDK6.0自帶webservice

當(dāng)然建立對(duì)應(yīng)的包,就不用說了。

然后編譯文獻(xiàn)。

進(jìn)入命令提醒符下,進(jìn)入classes目錄,運(yùn)行:wsgen

-cp.WebServices.WSProvider

可以看到將剛剛的class生成了幾種java文獻(xiàn)和class

文獻(xiàn)。

目前要做的是公布ws到

ht^p://k)calhost8888/chinajash/WSProvider

而實(shí)際上的動(dòng)作就是:

Endpoint.publish("http://tocalhost8888/chinajash/WSP

roviderr\newWSProviderQ);

當(dāng)然直接運(yùn)行WSProvider。

然后輸入

http://k)calhost8888/JAVA-HE/WSProvider?wsdl

就已經(jīng)查看到生成的Iwsdl(webservice描述語言)。

也就是服務(wù)端就0K了。

保持運(yùn)行。編寫一種測(cè)試客戶端:

首先選擇項(xiàng)目,右鍵新建web服務(wù)客戶端。其中wsurl

填入剛剛生成的wsdl地址:

http://tocalhost8888/JAVA-HE/WSProvider?wsdl

(實(shí)際上:和wsimport

http://localhost8888/JAVA-HE/WSProvider?wsdl同樣的

效果)

產(chǎn)生一種效果:在classes下按照之前指定的名字空

間產(chǎn)生的包下(目錄構(gòu)造)生成了7個(gè)協(xié)助classo

然后我們建立一種包c(diǎn)lient建立測(cè)試文獻(xiàn):

/*

*Tochangethistemplate,chooseTools|Templates

*andopenthetemplateintheeditor.

*/

packageclient

importnet.btogjava.java_he.*;

/**

*

*@authorhecm

*/

publicclassTest{

publicstaticvoidmain(Stringargs[])

(

HelloServicehs=newHelloServiceQ;

WSProviderws=hs.getWSProviderPortQ;

System.out.println(ws.sayHi("hechangmin"));

ws.printSystemTime();

)

運(yùn)行這個(gè)測(cè)試類:

Hthechangmin

輸出了。順利完畢!

提醒:一公布的地址最佳寫成可配置。尚有就是wsdl中

會(huì)嚴(yán)格按照你指定的url來訪問,例如你指定的

那么你用本機(jī)IP的時(shí)候也許并不能順利訪問。

實(shí)現(xiàn)基于IDEA算法的加密工具

/*-文獻(xiàn)名:idea.c*/

/*-*/

/*-功能:運(yùn)用idea加密算法實(shí)現(xiàn)文獻(xiàn)H勺加密*/

/*-*/

/*-闡明:*/

/*-這是運(yùn)用IDEA算法實(shí)現(xiàn)R勺文獻(xiàn)加密工具可以在怯律容許范圍內(nèi)以非商*/

/*-業(yè)形式自由使用,該程序的J所有權(quán)利由作者吳真保留*/

/*-7

/*-版本號(hào):1.0.0(.6)*/

/*-7

#include

#include

#include

#include

#include

#include"idea.h"

typedefintINT32;

typedefcharINT8;

typedefunsignedcharUL0NG8;

typedefunsignedshortUL0NG16;

typedefunsignedlongULONG32;

#defineSUCCESS0

^defineFAIL-1

#defineWZ_COMMEND_NUM4

^defineWZUSEHELPNUM7

#defineREADFILESIZE512/*一次從文獻(xiàn)中讀取多少字節(jié),可以根據(jù)內(nèi)存的大小調(diào)整*/

INT32file_enc(FILE*readfile,FILE*writefile/ULONG8*key);/*加密文獻(xiàn)*/

INT32file_dec(FILE*readfilefFILE?writefile,UL0NG8*key);/*解密文獻(xiàn)*/

INT32hextofile(ULON38*buf,FILE?writefile,ULONG32length);/*以16進(jìn)制寫入文獻(xiàn)*/

INT32encodehex(ULONG8*tobufzULONG8*frombuf,ULONG32len);/*16進(jìn)制解碼*/

voidwz_printhelp();/*打印協(xié)助*/

INT8*WZ_Commend_Help[]=

(

”基于IDEAH勺加密解密工具vl.O"f/*0*/

”追求卓越,勇于創(chuàng)新",

”一著者:吳真一,

IIII

);

INT8*WZ_USE_HELP[]={

"輸入5個(gè)參數(shù):",

"\tl.可執(zhí)行文獻(xiàn)名*.exe",

"\t2.操作類型1:加密;2:解密工

”\t3.讀出數(shù)據(jù)的文獻(xiàn)名*.txt”,

“\t4.寫入數(shù)據(jù)H勺文獻(xiàn)名*.txt”,

”\t5.密鑰(32字節(jié)蜜

II******************************II

);

voidmain(INT32argcJNT8*argv[])

(

INT8*FILENAME1,*FILENAME2;

FILE*fp,*fp2;

ULONG8key[33]={0};/*密鑰容器*/

if(argc!=5)

(

wz_printhelp();

return;

)

FILENAMEl=argv[2];

FILENAME2=argv[3];

,

if((fp=fopen(FILENAIVEl;r+b"))==NULL||(fp2=fopen(FILENAME2/"w+b"))==NULL)

(

printf("Can'topenfile\n");

return;

)

memcpy(key,argv(4],strlen(argv[4]));/*獲得密鑰*/

switch(atoi(argv[l]))

case1:/*加密操作*/

file_enc(fp,fp2,key);

printf("\n\tlDEA加密完畢,密文存于%s文獻(xiàn)\n,F(xiàn)ILENAME2);

break;

case2:

/*解密*/

file_dec(fpzfp2zkey);

printf("\n\tIDEA解密完畢,明文存于%s文獻(xiàn)\n",FILENAME2);

break;

default:

printf("請(qǐng)選擇是力口密|解密plesechooseencrypt|deencrypt\n");

break;

)

fclose(fp);

fclose(fp2);

)

INT32hextofile(ULON38*buf,FILE?writefile,ULONG32length)

(

ULONG32writelen=0;

/*以16進(jìn)制形式寫入文獻(xiàn)*/

while(writelen<length)

if(buf[writelen]==0)

fprintf(writefile,"%x",0);

fprintf(writefile,"%x",0);

}

elseif(buffwritelen]<0x10)

(

fprintf(writefile,"%x",0);

fprintf(writefile,"%x",buf[writelen]);

)

else

(

fprintf(writefile,"%x",buf[writelen]);

)

writelen++;

)

returnSUCCESS;

)

INT32file_enc(FILE*readfile,FILE*writefile,ULONG84key)

(

INT32filelen=0,readlen=O,writelen=0;

ULONG32totalfilelen=0;/*記錄實(shí)際歐J文獻(xiàn)的長度

INT32i;

ULONG8readbuf[READFILESIZE]={0};

idea_makekey((ULONG32*)key,outkey);

filelen=fread(readbu;sizeof(INT8),READFILESIZE,readfile);

while(filelen==READFILESIZE)

totalfilelen+=READFILESIZE;

for(i=0;i<READFILESIZE;i+=8)

(

idea_enc((ULONG16*:i&readbuf[i]);/*力口密*/

)

hextofile(readbuf,writefile,READFILESIZE);/*以16進(jìn)制形式寫入文獻(xiàn)*/

memset(readbuf,OzREADFILESIZE);

filelen=fread(readbu;sizeoffINT8),READFILESIZE,readfile);

)

/*這是從文獻(xiàn)中讀出的最終一批數(shù)據(jù),長度也許會(huì)等于0,因此要先判斷*/

if(filelen>0)

(

/*假如從文獻(xiàn)中讀出的長度不等于0,那么肯定有8個(gè)字節(jié)以上日勺空間

文獻(xiàn)長度存在最終8個(gè)字節(jié)中*/

totalfilelen+=filelen;

memcpy(&readbuf[READFILESIZE-8],(ULONG8*)&totalfilelen,4);

for(i=0;i<READFILESIZE;i+=8)

(

idea_enc((ULONG16*j&readbuf[i]);/*加密*/

)

hextofile(readbuf,writefile,READFILESIZE);/*以16進(jìn)制形式寫入文獻(xiàn)*/

memset(readbuf,0,READFILESIZE);

)

else/*filelen==0*/

memcpy(&readbuf[0],(ULONG8*)&totalfilelen,4);

idea_enc((ULONG16*:i&readbuf[0]);/*力口密*/

hextofile(readbuf,writefile,8);/*以16進(jìn)制形式寫入文獻(xiàn)*/

)

returnSUCCESS;

)

INT32file_dec(FILE*readfile,FILE*writefile/ULONG8*key)

(

INT32filelen=0,readlen=0,writelen=0;

ULONG32totalfilelen=0;/*記錄實(shí)際吊J文獻(xiàn)W、J長度*/

INT32i,num;

ULONG8readbuf[READFILESIZE]={0};

ULONG8sendbuf[READFILESIZE*2]={0};

idea_makekey((ULONG32*)key,outkey);

key_decryExp(outkey);

fseek(readfile,-16,SEEK_END);/*最終16個(gè)字節(jié)的表達(dá)文獻(xiàn)長度的空間*/

filelen=fread(sendbuf,sizeof(INT8),16,readfile);

encodehex(readbuf,sendbuf,8);

idea_dec((ULONG16*)&readbuf[0]);/*解密*/

得到文獻(xiàn)總長*/

memcpy((ULONG8*)&totalfilelen/&readbuf[0],4);/*

memset(readbuf,0,8);

memsettsendbutO,16);

num=totalfilelen/READFILESIZE;/*有幾利?READFILESIZE組*/

totalfilelen%=READFILESIZE;

fseek(readfile,O,SEEK_SET);/*跳到文獻(xiàn)頭*/

while(num-)

(

filelen=fread(sendbuf,sizeof(INT8),READFILESIZE*2,readfile);

encodehex(readbuf,sendbuf,READFILESIZE);

for(i=0;i<READFILESIZE;i+=8)

(

idea_dec((ULONG16*:i&readbuf[i]);/*解密*/

)

writelen=fwrite(readbuf,sizeof(INT8),READFILESIZE,writefile);

memset(readbuf,0,READFILESIZE);

memset(sendbutO,READFILESIZE*2);

)

if(totalfilelen>0)/*最終?塊有多出口勺元素*/

(

filelen=fread(sendbuf,sizeoffINT8),READFILESIZE*2,readfile);

encodehex(readbuf,sendbuf,READFILESIZE);

for(i=0;i<READFILESIZE;i+=8)

(

idea_dec((ULONG16*j&readbuf[i]);/*解密*/

)

writelen=fwrite(readbuf,sizeof(INT8),totalfilelen,writefile);

memset(readbuf,0,READFILESIZE);

memset(sendbuf,0,READFIlESIZE*2);

)

returnSUCCESS;

)

INT32encodehex(ULONG8*tobuf,ULONG8*frombuf,ULONG32len)

(

UL0NG8*readfirst=frombuf;

ULONG8*readend=&frombuf[l];

INT8*s;

ULONG8y[2];

ULONG32i;

for(i=0;i<len;i++)

(

y[0]=*readfirst;

y(l]=*readend;

readfirst+=2;

readend+=2;

tobuf[i]=(ULONG8)strtol((INT8*)yz&s,16);

)

returnSUCCESS;

)

voidwz_printhelp()

(

INT32i;

printf("\t");

for(i=0;i<22;i++)

printf(”%c,5);

)

printf("\n");

for(i=0;i<WZ_COMMEND_NUM;i++)

(

printf("\t%c\t%s%c\n"/5zWZ_Commend_Help[i],5);

}

printf("\t");

for(i=0;i<22;i++)

(

printf("%c",5);

)

printf("\n");

for(i=0;i<WZUSEHELPNUM;i++)

(

printf("\t%s\n",WZ_USE_HELP[i]);

)

return;

)

實(shí)現(xiàn)和IE瀏覽器交互的幾種措施的簡(jiǎn)介

1.引言

怎樣實(shí)現(xiàn)對(duì)IE瀏覽器中對(duì)象曰勺操作是一種很有實(shí)際意義問題,通過和IE綁定的DLL我

們可以記錄IE瀏覽過的網(wǎng)頁的次序,分析顧客的使用行為和模式。我們可以對(duì)網(wǎng)頁的內(nèi)容進(jìn)

行過濾和翻譯,可以自動(dòng)填寫網(wǎng)頁中常常需要顧客填寫叼Form內(nèi)容等等,我們所有的例子代

碼都是通過VC來表達(dá)的,采用的原理是通過和IE對(duì)象的接口的交互來實(shí)現(xiàn)對(duì)IE的訪問.實(shí)

際上是采用COM日勺技術(shù),我們懂得COM是和語言無關(guān)的一種二進(jìn)制對(duì)象交互的)模式,因此

實(shí)際上我們下面所描述的內(nèi)容都可以用其他的語言來實(shí)現(xiàn),例如VB,DELPHI,C++Builder等

等。

2.IE實(shí)例遍歷實(shí)現(xiàn)

首先我們來看系統(tǒng)是怎樣懂得目前有多少個(gè)IE日勺實(shí)例在運(yùn)行。

我們懂得在Windows體系構(gòu)造下,一種應(yīng)用程序可以通過操作系統(tǒng)的運(yùn)行對(duì)象表來和

這些應(yīng)用H勺實(shí)例進(jìn)行交互,不過IE目前H勺實(shí)現(xiàn)機(jī)制是不在運(yùn)行對(duì)象表中進(jìn)行注冊(cè),因此需要

采用其他的措施。我們懂得可以通過Shellwindows集合來代表屬于shell的I目前打開的窗口

的集合,而IE就是屬于shell的一種應(yīng)用程序。

下面我們描述一下用VC實(shí)現(xiàn)對(duì)目前IE實(shí)例的進(jìn)行遍歷II勺措施。IShellWindows是有關(guān)

系統(tǒng)shell日勺一種接口,我們可以定義一種如下的接口變量:

SHDocVw::IShellWindowsP:rm_spSHWinds;

然后創(chuàng)立變量口勺實(shí)例:

m_spSHWinds.Createhstance

(_uuidof(SHDocVw::ShellWindows));

通過IShellWindows接口II勺措施GetCount

可以得到目前實(shí)例的數(shù)目:

longnCount=m_spSHWinds->GetCount();

通過IShellWindows接口H勺措施Item

可以得到每一種實(shí)例對(duì)象

IDispatchP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論