经过证实,lichd 的观点正确,由于我在本文发表之前,除Base64 之外,其他的BaseXX 都没接触过,所以不知道这个正是Base32 的效果。
不过看官们请放心,本文的思路也和Base32 符合。当时的乱打乱撞,结果造了一个古人已经造好的轮子,实在惭愧。
因此,感谢lichd 的观点,从而稀释了我体内SB细胞的浓度。
回头看了一下本文的一个旧实现(codec.zip ),一年前写得代码太糟糕了,不推荐。
现在提供一个相对不错的实现,>>猛击获取<< 。
-------------------------- -------------------------- -------------------- ---------------------
------------------------------------------分割线 --------------------------------------------
-------------------------- -------------------------- -------------------- ---------------------
很久之前发现淘宝网的搜索关键字在编码后有点可爱,小写英文字母+数字的组合。
想去研究一下,但是后面好像没了回事似的。。记性不好
然后这两天不知道为什么,突然间抽起条脑筋,跑去研究。。。。
--------------------------开始分割线--------------------------
在淘宝网上用关键字“gembler”搜索一下商品,得出以下URL:
http://search1.taobao.com/browse/0/n-0-----------------g,m5sw2ytmmvza----------------40--commend-0-all-0.htm?at_topsearch=1
(留意上面这里:“m5sw2ytmmvza” )
经过一轮 天昏地暗、沙尘滚滚 的分析、研究之后,得出以下结论:
在Base64中,码表是由 [A-Z,a-z,0-9,+,/,=(pad)] 组成的。
然后自己也弄个码表,由 [a-z,2-7(这个2-7是在 淘宝网上搜索了n次而得出的结论) ] 组成的:
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
-------------------------------愚蠢分割线---------------------------------
s | t | u | v | w | x | y | z | 2 | 3 | 4 | 5 | 6 | 7 |
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
在Base64中,是将二进制连成一串,然后再按6位来分割,分割完后在前面补0,这个地球人都知道,不多说了。
而我呢,哈哈,捣蛋一下,按5位来分割,如果刚好够分,那就爽了,
但是,世事往往不如人意,位数不够,那咋办呢?看下面 :)
在Base64中,是用"="来解决的吧。
现在呢,就是在前面补0,然后在后面再补0,其实就是前后补0,
但是, 按5位来分 割 ,前面3个0是补定的了,后面的0就看上帝怎么安排了。
举个小例子:字符串 "aaa",(编码/加密)后是 "mfqwc"
二进制: | 01100001 | 01100001 | 01100001 | |
|
转换后: | (000 )01100 | (000 )00101 | (000 )10000 | (000 )10110 | (000 )0001(0 ) |
十进制: | 12 | 5 | 16 | 22 | 2 |
码表对应: | m | f | q | w | c |
反过来,(解码/解密):
码表对应: | m | f | q | w | c |
十进制: | 12 | 5 | 16 | 22 | 2 |
二进制: | 00001100 | 00000101 | 00010000 | 00010110 | 00000010 |
去掉前3个0后: | 01100 | 00101 | 10000 | 10110 | 00010 |
合并后: | 0110000101100001011000010 |
然后把合并后的串的长度除一下8,发现多了个0:
合并后的 二进制码: | 01100001 | 01100001 | 01100001 | 0 |
多了就算了,不要了(其实是在{编码/加密}的分割时候,在分剩的余数的后面补的0)。
然后再将 byte[] 转回字符串
OK!又见回"aaa"了。 :)
*有一点值得注意的是:UTF-8、GBK、GB18030 一般都没什么问题,但是 GB2312 可能字符集不够丰富,繁体字在decode的时候成问号了。
搞了半天,“可视化编辑器”的 Java Code不好使,骨干代码在回帖里贴出................(完整的代码,有兴趣的同志们请见附件! )
--------------------------结束分割线--------------------------
。。。整理好了,整个人都铺满了灰尘.......
PS:不知道淘宝网的思路是不是这样
(补:另外一篇讨论 - “ 拍拍网的搜索关键字的编码与解码 ”)