利用as打造密文解码器?
例如:A到Z到a到z排列成一个环,字母A用字母C代替,字母B则用字母D代替……比如密文“ABC”解码后为“CDE”……那么我们看一下“DjYqf”解码后会是什么呢?
解决思路 首先,我先说一下基本的编程思路:
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
第1步:定义密文数组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步:建立数组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
第3步:将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
第4步:将密文(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好了。
发布测试吧,在弹出的Output窗口就会得到明文了。参看源文件“密文解码器”。
非凡说明
此“解码器”只能运行在Flash?MX测试环境中,如生成.swf?或?.exe文件后,则无法得到结果。由于此文的主要目的是讲解Action?Script的编程思路,所以并未介绍输出为swf的步骤。不过聪明的你一定会有办法的(提示一下,将myText做成输入文本的变量,而myMingwen做为一个动态文本的变量,再加入一个按钮,一个最简单的‘密文解码器’就诞生了。当然,假如你有爱好和耐心的话,也可以把它做成标准的windows小程序:有菜单、有帮助说明、有版权信息等……)