精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-09-30
这是一道搜狗的笔试题,要求30分钟。根据encode方法写出对应的decode方法。最后运行程序输出的结果就是要求的答案。先不看答案,trying一下吧。程序如下:
public class Test { public static void encode(byte[] in, byte[] out, int password) { int len = in.length; int seed = password ^ 0x8c357ca5; for (int i = 0; i < len; ++i) { byte a = (byte) ((in[i] ^ seed) >>> 5); byte b = (byte) (((((int) in[i]) << 16) ^ seed) >>> (16 - 3)); a &= 0x7; b &= 0xf8; out[i] = (byte) (a | b); seed = (seed * 3687989 ^ seed ^ in[i]); } } public static void decode(byte[] in, byte[] out, int password) { int len = in.length; int seed = password ^ 0x8c357ca5; for (int i = 0; i < len; ++i) { // fill the code here } } public static void main(String[] args) throws Exception { int password = 0xe87dd9d3; byte[] buf1 = { 29, -16, 96, 43, -85, 25, -96, 83, 13, 66, -109, 49, -111, 0, 60, -101, 99, -86, -38, 86, -35, 48, 23, 83, -102, 25, 73, -116, -101, -88, -5, 14, -14, -112, 87, -87, 2, 108, -58, 40, 56, 12, 108, 77, 83, 38, 20, -114, }; byte[] buf2 = new byte[buf1.length]; decode(buf1, buf2, password); System.out.println(new String(buf2, "GBK")); } } ---------------------------------------------------------- 最后输出结果是:搜狗输入法支持各种炫酷的皮肤,彰显个性的你!!! 其中一种实现方式为: byte a = (byte) (((in[i]&0x7) <<5) ^seed); byte b = (byte) ((((((int) in[i])&0xf8) << 13) ^ seed) >>> 16); a &= 0xe0; b &= 0x1f; out[i] = (byte) (a | b); seed = (seed * 3687989 ^ seed ^ out[i]); 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-10-01
网上测评的题目么?
我第一遍没做出来 后面想出来了 确实很有意思 |
|
返回顶楼 | |
发表时间:2011-10-01
我多次看成了狗一样的笔试题
我表示自己邪恶了很多 |
|
返回顶楼 | |
发表时间:2011-10-01
恩 蛋疼了
|
|
返回顶楼 | |
发表时间:2011-10-01
看不懂,可以解释一下吗?
|
|
返回顶楼 | |
发表时间:2011-10-02
其实还是蛮简单的,我在做的时候一开始也是愣了一下,后来想明白了答案就出来了,就是一个位置变换和异或操作而已,只要按照加密的方式反过来即可
|
|
返回顶楼 | |
发表时间:2011-10-02
发现自己真的很菜。。。。
|
|
返回顶楼 | |
发表时间:2011-10-02
为什么后面的
a &= 0xe0; b &= 0x1f; |
|
返回顶楼 | |
发表时间:2011-10-02
a &= 0xe0;
b &= 0x1f; 请教这两个数是怎么得到的? |
|
返回顶楼 | |
发表时间:2011-10-02
a &= 0xe0;
b &= 0x1f; 是表示a只要1110000这三位 b只要00011111后面这五位 因为在异或运算之后会出现一些冗余的数据 而我只需要这特定的几位数据就可以了 |
|
返回顶楼 | |