用AS来打造“密文解码器” |
| 作者:佚名 来源:作者: AIYI2003 更新:2007-1-13 20:48:31 错误报告 我要投稿 |
首先我们来看一下一个迷题: A到Z到a到z排列成一个环,字母A用字母C代替,字母B则用字母D代替…… 比如密文“ABC”解码后为“CDE”…… 那么我们看一下“uuuDjYqfcpalyGWG”解码后会是什么呢?
用手一个一个的算???不会吧!我们有Flash MX!虽然Flash不是用来开发软件的,但她的AS编程同样十分了得,下面偶就用Flash MX 的AS来解决这个问题——我们可以用Flash 的AS来编写一个“密文解码器”,让Flash帮我们行进解密…… Flash 世界最强の兵器 ——Action Script 100%Action打造“密文解码器”
真·AIYI
首先,我先说一下基本的编程思路: 1、看一下原文中的“A到Z到a到z排列成一个环,字母A用字母C代替……”我们先不管后面那几句,只看第1句,“A到Z到a到z排列成一个环”那么,编程的第1步已经有了:新建一数组1,元素为A-Z,a-z共52个元素,此数组即为密文数组(Miwen)。 2、这时我们在看一下后面的那几句“字母A用字母C代替,字母B则用字母D代替……”这样,编程的第二步也有了:按原文提到的字母替换规则,将上面数组(Miwen)中所有元素向前‘移’两位,最前面的两位放到后面,得到一个新数组2,其元素为C-Za-zAB。 3、这时我们看一下,数组1中的某位置上的元素(密文)的原文就是数组2相同位置上的元素。如数组1中第一个元素是“A”,而数组2中的第一个元素是“C”(即“ZT01”一文中提到的“字母A用字母C代替”……) 4、我们只要将A-Z、a-z分别赋值为1-26、27-52。这时解密文时就只须将密文字母所代表的值来对应数组2中的元素即可(如“B”的值是2,那么在数组2中的第2个元素“D”就是“B”的原文……)。 5、但在Flash中变量不分大小写,也就是说“A”与“a”(“B”与“b”……)代表的是同一变量。不过没关系,我们可以把大写的“A”双拼为“AA”、大写字母“B”双拼为“BB”,这样就与小写字母区分开了。 6、当然,密文不可能是单一的一个字母,而是一串字母,这样我们就要用到String.substr(字符串截取)函数,并把截取的字母存放到新的数组中,再与数组2中的元素相对应就可得到明文。 7、将所有Action写在一帧中与写入多帧中得到的效果是一样的(针对本文来说),但我们最好能有这样一个习惯:如没有特殊情况,最好将AS按其所完成的功能分别写入不同的帧中,这样日后修改起来会非常方便。
好了,既然基本的编程思路已经有了,那么开始编程吧! <第1帧中的AS> 第一步:定义密文数组Miwen(),元素为A-Z,a-z 1、定义大写字母A-Z的数组Miwen1(),其元素为大写字母A到Z miwen1=new Array() my_i=65 while (my_i<=(65+25)){ miwen1[my_i-65]=String.fromCharCode(my_i) my_i++ }
2、定义小写字母a-z的数组Miwen2() miwen2=new Array() my_j=97 while(my_j<=(97+25)){ miwen2[my_j-97]=String.fromCharCode(my_j) my_j++ }
3、将Miwen1与Miwen2联合为Miwen() miwen=new Array() miwen=miwen1.concat(miwen2)
4、测试Miwen数组长度与数组内的元素 /*trace(Miwen.length) my_z=0 while(my_z<Miwen.length){ trace(Miwen[my_z]) my_z++ }*/
第二步:建立数组2 Yuanwen(),元素为C-Za-zAB
1、将Miwen数组中的元素‘copy’到Yuanwen1数组中 yuanwen1=new Array() yuanwen1=yuanwen1.concat(miwen)
2、将Yuanwen1中的元素进行‘移位’ yuanwen_AB=new Array("A","B") yuanwen=new Array() yuanwen=yuanwen1.concat(yuanwen_AB) yuanwen.splice(0,2)
3、测试Yuanwen数组的长度与其元素 /*trace(yuanwen.length) my_z=0 while(my_z<yuanwen.length){ trace(yuanwen[my_z]) my_z++ }*/
<第二帧中的AS> 第三步:将A-Z,a-z分别赋值为1-26,27-52,但由于Flash中变量不分大小写,所以,大写的“A”双拼为“AA”、大写字母“B”双拼为“BB”,这样就与小写字母区分开了。
1、定义Big_abc()数组,元素为大写字母A-Z,并将大写字母全部‘双拼’,随后为其元素赋与相应的值。 my_i=1 big_abc=new Array() while(my_i<=26){ big_abc[my_i-1]=String.fromCharCode(64+my_i)+String.fromCharCode(64+my_i) set (big_abc[my_i-1],my_i) my_i++ }
2、定义Small_abc()数组,元素为小写字母a-z,并为其赋与相应的值。 my_j=1 small_abc=new Array() while (my_j<=26) { small_abc[my_j-1]=String.fromCharCode(96+my_j) set (small_abc[my_j-1],26+my_j) my_j++ }
<第三帧中的AS> 第四步:将密文(myText)分别拆分为单个字母并放入myTexts()数组内(注意大写字母要‘双拼’),并用Mingwen_num()数组存储myTexts()数组元素所对应的数值。最后用Mingwen_num数组元素与Yuanwen()数组内的元素相对应即可得到明文。
mytext = "uuuDjYqfcpalyGWG"; //这就是密文了,可以做成输入文本 //将密文拆分为单个字母并放入myTexts()数组内 mytexts = new Array(); mylength = mytext.length; my_i = 1; while (my_i<=mylength) { mytexts[my_i-1] = mytext.substr(my_i-1, 1); my_i++; } //将大写字母进行‘双拼’ mycode = mytexts.join(""); mystr = new String(mycode); myteststr = new String("a"); my_i = 1; while (my_i<=mylength) { mytexts[my_i-1] = mytext.substr(my_i-1, 1); if ((mystr.charCodeAt(my_i-1))<(myteststr.charCodeAt(0))) { mytexts[my_i-1] = mytexts[my_i-1]+mytexts[my_i-1]; } //trace(mytexts[my_i-1]) my_i++; } mingwen_num = new Array(); //定义mingwen_num数组 //用Mingwen_num数组元素与Yuanwen()数组内的元素相对应即可得到明文。 mingwen = new Array(); my_i = 1; while (my_i<=mylength) { mingwen_num[my_i-1] = eval(mytexts[my_i-1]); my_i++; } my_i = 1; while (my_i<=mylength) { mingwen[my_i-1] = yuanwen[mingwen_num[my_i-1]-1]; my_i++; } mymingwen = mingwen.join(""); //可做为动态文本 trace(mymingwen); stop(); //如果不加它的话会一直不停地出,所以还是加上个stop好了。
这时,只要按Ctrl+回车测试,在弹出的Output窗口就会得到明文了。 注:此“解码器”只能运行在Flash MX测试环境中,如生成.swf 或 .exe文件后,则无法得到结果。由于此文的主要目的是讲解Action Script的编程思路,所以并未介绍输出为swf的步骤。不过聪明的你一定会有办法的(提示一下,将myText做成输入文本的变量,而myMingwen做为一个动态文本的变量,再加入一个按钮,一个最简单的‘密文解码器’就诞生了。当然,如果你有兴趣和耐心的话,也可以把它做成标准的windows小程序:有菜单、有帮助说明、有版权信息等……)
以上这些希望能起到抛砖引玉的作用,让更多的人喜欢上Flash 喜欢上AS……
源文件……
点击浏览该文件
|
|
| 文章录入:skyuu 责任编辑:skyuu |
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |