当前页面: 开发资料首页 → J2ME 专题 → 手机游戏修改(6)switch之lookupswitch
手机游戏修改(6)switch之lookupswitch
摘要: 手机游戏修改(6)switch之lookupswitch
手机游戏修改(6)switch之lookupswitch
我们知道,手机的键值可以从-23(可能更小)到57(可能更大)之间变化,用上篇中提到的tableswitch的方法来处理分支程序的话,就需要有七、八十个选项。如果在一个程序里面,我们只用-23和57这两个键值的话,用tableswitch 就有点大材小用了,而且还要多占用空间。所以我们这里介绍lookupswitch,lookupswitch与tableswitch比起来,显得更灵活。我们举个简单的例子来看一下它的结构:
比如源程序里的一段代码:
switch(i1)
{
case -1:
a.a();
case 49:
a.b();
}
这是一个简单的例子。这里我们还是假设,i1是keycode,这里只出现了-1和49,我们知道诺机和MOTO的这两个键值对应的按键是相同的。-1是上方向键,49是按键1的键值。这段程序的意思是,如果按下上方向键,执行a.a()这个函数,如果按下1的话,执行a.b()这个函数。
那么在bytecode里面,它可能对应着这样的一段代码:
AB 00 00 00 00 00 E8
00 00 00 02 FF FF FF FF 00 00 00 E7 00 00 00 31
00 00 00 E9
这里,红色的部分就是lookupswitch开关的意思,说明下面这一段二进制码是lookupswitch。
蓝色的字,与tableswitch一样,也是个label。这两个地方两种switch结构是一样的。
下面的紫色部分就与tableswitch不一样,这里只是给出了分支的个数,而不像tableswitch 里面,给出的是两端的数值。
剩下的部分,每8个字节为一个单位,前4个字节,对应着case后面的那个数字,后4个字节是label,表示要转向这个label来执行相应的指令。比如:FF FF FF FF 00 00 00 E7 前四个字节“FFFFFFFF”是-1的十六进制,后4个字节00 00 00 E7是一个卷标。
这个应该很好理解吧,我们就不多解释了。
弄清了lookupswitch的原理,我们就可以进行修改了。比如我们要将case -1改成case -6,那么只需将FFFFFFFF 修改成FFFFFFFA就可以了。
不过,有一点是需要特别注意的,在lookupswitch这个表中,数字必须按照从小到大,从负到正的顺序来写。比如前面例子,如果换成下面的样子,就会出错了。
AB 00 00 00 00 00 E8
00 00 00 02 00 00 00 31 00 00 00 E9 FF FF FF FF
00 00 00 E7