日期:2014-05-20 浏览次数:20831 次
public class Test { public static void main(String[] args) throws Throwable { String code="757365726e616d653d74657374267369676e3d39363337316431323365333366626263333339356361623839653636346161392673657276657269703d3132372e302e302e3126736572766572706f72743d383538266e7063646f776e6c6f616475726c3d687474703a2f2f3132372e302e302e313a38303831"; System.out.println("------decode------"); String ret = encode(code); //加密 System.out.println(ret); System.out.println("------decode------"); ret = decode(ret); //解密 System.out.println(ret); System.out.println(code.equals(ret)); //测试加密解密后是否和原数据一致 } public static String encode(String code) { //加密算法,就是LZ的代码抽出来做个方法 String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; char[] chs = new char[code.length()]; for (int i = 0; i < code.length(); i++) { int addx = i % 62; int c = code.charAt(i); int dx = chars.indexOf(c); dx += addx; dx %= 62; chs[i] = chars.charAt(dx); } return new String(chs); } public static String decode(String code) { //解密算法,就是加密反过来 String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; char[] chs = new char[code.length()]; for (int i = 0; i < code.length(); i++) { int addx = i % 62; int c = code.charAt(i); int dx = chars.indexOf(c); dx -= addx; if (dx < 0) dx += 62; chs[i] = chars.charAt(dx); } return new String(chs); } }
------解决方案--------------------
code是源字符串,其中的每个字符,查表决定其对应的目标字符。
查表规则如下:
每个字符,如果在源字符串中是第i个字符,则在码表中找该字符后第i个位置上的目标字符作为替换。
每个源字符对应一个目标字符。
如,第一个字符是7,所以找7后面的第0个字符,就是7自己。
第二个字符是5,所以找5后面的第1个字符,是6。
第3个字符是7,所以找7后面的第2个字符,是9
...