- 浏览: 37213 次
- 性别:
- 来自: 妖都
最新评论
-
song_in_china:
为什么下载下来的东西不对啊
短域名/URL Shortening/Base36/Base62 -
thebye85:
...
短域名/URL Shortening/Base36/Base62 -
gembler:
wavesun 写道请教一个问题:如果不用ssl,在安全性上会 ...
Yale CAS without SSL/HTTPS -
wavesun:
请教一个问题:如果不用ssl,在安全性上会有哪些威胁?我一直搞 ...
Yale CAS without SSL/HTTPS -
realzhang:
解决了我n久的疑惑
淘宝网的搜索关键字的编码与解码
对这些都有规范
经过证实,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:不知道淘宝网的思路是不是这样
(补:另外一篇讨论 - “ 拍拍网的搜索关键字的编码与解码 ”)
- codec.zip (4.1 KB)
- 下载次数: 2036
- Base32.java.tar.gz (922 Bytes)
- 下载次数: 869
评论
是为了增加复杂度,看起来更专业?
用处很大么
第一:url编码一般是为了避免乱码的出现;
第二:淘宝为什么自己告个编码?而且这样的编码居然也能让楼主分析出来,十分怀疑楼主和淘宝有点什么联系?
有道理!还是Base64转出来的看着顺眼些。
Base64转出来的也不是很顺眼。。(大小写,数字,+,=,/) 一起来。
youku疑似Base64转出来的:
http://v.youku.com/v_show/id_XNTY4ODk1NDA=.html
对对对,这么一说,才想起来,确实视频网站上的视频地址好象都是类似这样的编码风格。
原来这是Base64做出来的。
有道理!还是Base64转出来的看着顺眼些。
Base64转出来的也不是很顺眼。。(大小写,数字,+,=,/) 一起来。
youku疑似Base64转出来的:
http://v.youku.com/v_show/id_XNTY4ODk1NDA=.html
少见多怪的问一句:淘宝为什么要对url进行Base64编码啊?
哈···其实我也不知道。。。
不过经过Base64后,可能会带有 '/'
嘿嘿,就因为这个?
哈·这还是请淘宝网的研发人员回答吧···我纯粹兴趣研究
不过 '/' 这东西拼上URL就有点点问题,如果处理不当的话。
使用URLEncoder转一下不成吗?
如果关键字多一点,转出来就又长又臭了,不好看
有道理!还是Base64转出来的看着顺眼些。
少见多怪的问一句:淘宝为什么要对url进行Base64编码啊?
哈···其实我也不知道。。。
不过经过Base64后,可能会带有 '/'
嘿嘿,就因为这个?
哈·这还是请淘宝网的研发人员回答吧···我纯粹兴趣研究
不过 '/' 这东西拼上URL就有点点问题,如果处理不当的话。
使用URLEncoder转一下不成吗?
如果关键字多一点,转出来就又长又臭了,不好看
少见多怪的问一句:淘宝为什么要对url进行Base64编码啊?
哈···其实我也不知道。。。
不过经过Base64后,可能会带有 '/'
嘿嘿,就因为这个?
哈·这还是请淘宝网的研发人员回答吧···我纯粹兴趣研究
不过 '/' 这东西拼上URL就有点点问题,如果处理不当的话。
使用URLEncoder转一下不成吗?
少见多怪的问一句:淘宝为什么要对url进行Base64编码啊?
哈···其实我也不知道。。。
不过经过Base64后,可能会带有 '/'
嘿嘿,就因为这个?
哈·这还是请淘宝网的研发人员回答吧···我纯粹兴趣研究
不过 '/' 这东西拼上URL就有点点问题,如果处理不当的话。
少见多怪的问一句:淘宝为什么要对url进行Base64编码啊?
哈···其实我也不知道。。。
不过经过Base64后,可能会带有 '/'
嘿嘿,就因为这个?
少见多怪的问一句:淘宝为什么要对url进行Base64编码啊?
哈···其实我也不知道。。。
不过经过Base64后,可能会带有 '/'
少见多怪的问一句:淘宝为什么要对url进行Base64编码啊?
编码:
/** * (编码/加密)字节数组 * * @author gembler * @version 2008-12-3 下午03:14:43 * * @param keyBytes * 需要(编码/加密)的字节数组 * * @return (编码/加密)后的字符串 */ private static String encode(byte[] keyBytes) { if (keyBytes == null || keyBytes.length < 1) { return ""; } /* * 合并二进制码, * 如: * 00101010 11010011 00101101 10100011 * to * 00101010110100110010110110100011 */ StringBuilder mergrd = new StringBuilder(); for (int i = 0; i < keyBytes.length; i++) { FormatUtil.formatBinary(keyBytes[i], mergrd); } /* * 以5个bit为单位,计算能分多少组, * 如: * 00101010110100110010110110100011 * to * 00101 01011 01001 10010 11011 01000 11 * | * (这个11为余下的位) */ int groupCount = mergrd.length() / FIVE_BIT; // 计算余下的位数 int lastCount = mergrd.length() % FIVE_BIT; // 类似数据分页的算法,有余数的情况下需要加 1。 if (lastCount > 0) { groupCount += 1; } /* * (编码/加密) */ StringBuilder sbEncoded = new StringBuilder(); // 循环所需的条件 int forMax = groupCount * FIVE_BIT; // 每次递增5位来截取 for (int i = 0; i < forMax; i += FIVE_BIT) { // 结束点 int end = i + FIVE_BIT; /* * 如果结束点比已合并的二进制码串的长度要大, * 相当于有余数, * 并且表示当前循环到了(已合并的二进制码串的长度 % FIVE_BIT)的那一截。 */ // 标记是否到了余数的那一截 boolean flag = false; if (end > mergrd.length()) { /* * 如果结束点比已合并的二进制码串的长度要大, * 结束点需要被重设为: * 已合并的二进制码串的长度,等价于(i + lastCount). 并且重设标记。 */ end = (i + lastCount); flag = true; } // 截取 String strFiveBit = mergrd.substring(i, end); // 截取后从二进制转为十进制 int intFiveBit = Integer.parseInt(strFiveBit, BINARY); if (flag) { /* * 如果结束点比已合并的二进制码串的长度要大, * 或者是到了余数的那一截: * 需要左移操作,假设余下的二进制位为:11, * 那么需要从后面补0,左移操作后为 (000)11(000) */ intFiveBit <<= (FIVE_BIT - lastCount); } // 利用该十进制数作为码表的索引获取对应的字符,并追加到sbEncoded sbEncoded.append(CODEC_TABLE.charAt(intFiveBit)); } return sbEncoded.toString(); }
解码:
/** * (解码/解密)字符串 * * @author gembler * @version 2008-12-3 下午03:15:00 * * @param code * 需要(解码/解密)的字符串 * @param characterSet * 字符集 * * @return (解码/解密)后的字符串 */ public static String decode(String code, String characterSet) { if (code == null || code.length() < 1) { return ""; } /* * 拆除每一个字符,从码表里获取相应的索引。 */ StringBuilder sbBinarys = new StringBuilder(); for (int i = 0; i < code.length(); i++) { // 从码表里获取相应的索引 int index = getCodecTableIndex(code.charAt(i)); // 将十进制的索引转换为二进制串 String indexBinary = Integer.toBinaryString(index); // 去掉前3个0,并且追加到sbBinarys FormatUtil.formatBinary(indexBinary, sbBinarys, FIVE_BIT); } /* * 按8个bit拆分,剩下的余数扔掉。 * 扔掉的余数是在(编码/加密)的分割时候,在分剩的余数的后面补的0 */ byte[] binarys = new byte[sbBinarys.length() / EIGHT_BIT]; for (int i = 0, j = 0; i < binarys.length; i++) { // 每8个bit截取一份 String sub = sbBinarys.substring(j, j += EIGHT_BIT); // 将截取下来的二进制串转换为十进制 Integer intBinary = Integer.valueOf(sub, BINARY); binarys[i] = intBinary.byteValue(); } String decoded = null; if (characterSet == null || characterSet.length() < 1) { // 采用默认语言环境的 character set。 decoded = new String(binarys); } else { try { // 采用指定的 character set。 decoded = new String(binarys, characterSet); } catch (UnsupportedEncodingException e) { decoded = new String(binarys); } } return decoded; }
测试:
BufferedReader br = new BufferedReader(new InputStreamReader( System.in)); while (true) { System.out.print("输入字符号串:"); String in = br.readLine(); if ("exit".equalsIgnoreCase(in)) { break; } String enCode = Codec.encode(in); String deCode = Codec.decode(enCode); System.out.println(); System.out.println("original: " + in); System.out.println("encode: " + enCode); System.out.println("decode: " + deCode); System.out.println(); }
测试结果:
输入:JavaEye论坛频道
输出:
original: JavaEye论坛频道
encode: jjqxmykfpfs4fw6mwpdllnoa
decode: JavaEye论坛频道
然后跑去淘宝网敲入"JavaEye论坛频道"搜索。
得出:
http://search1.taobao.com/browse/0/n-g,jjqxmykfpfs4fw6mwpdllnoa----------------40--commend-0-all-0.htm?at_topsearch=1
比较一下:
jjqxmykfpfs4fw6mwpdllnoa - console输出
jjqxmykfpfs4fw6mwpdllnoa - 淘宝网URL
发表评论
-
Apriori Algorithm 点滴
2010-01-19 15:36 0总: 2^n - n + 1 首: n(a[1] + a[n] ... -
taobao笔试题
2009-06-25 16:17 01. 在重写了对象的equals方法后,还需要重写hashCo ... -
swap int vars
2009-06-11 21:55 0int a = 1,b = 2; /* * 有人 ... -
问题集
2009-05-05 18:31 0nfs v3 fcntl无法获取文件锁的问题解决: moun ... -
JVM的垃圾回收机制详解和调优
2009-02-08 20:12 01.JVM的gc概述 gc ... -
恶劣的3Djs
2009-01-13 16:33 0<!DOCTYPE HTML PUBLIC " ... -
javascript 编码解码(只针对英文字符)
2009-01-10 12:13 0javascript 编码解码(只针对英文字符) -
拍拍网的搜索关键字的编码与解码
2008-12-04 15:44 2540lichd 写道 刚刚看到你对淘宝编码 的研究,我个人认为 ...
相关推荐
标题“URL搜索关键字的编码”涉及的是在互联网中如何正确处理和编码URL中的查询参数,以便它们可以在HTTP请求中正确传输。在这个主题中,我们将深入探讨URL编码的原理、相关标准以及如何在Python中实现这一过程。 ...
航信汉字的编码与解码,编码便于使自己的pid进行汉字传输, 航信汉字编码与解码,eterm汉字编码与解码,汉字编码问题
在IT行业中,URL编码与解码是网络编程中不可或缺的一部分,尤其在处理包含特殊字符的网址时显得尤为重要。淘宝作为中国最大的电商平台,其URL中可能包含各种参数,这些参数需要进行正确的编码和解码以确保数据传输的...
实验还包含了对无干扰模拟话音信号和数字波形信号的PCM编码与解码。通过低通滤波器和示波器观察解码后的输出波形,以验证解码的准确性。此外,对于数字信号,通过比较输入和解码后的数字值,分析解码误差,探讨可能...
《卷积编码与解码的MATLAB实现及性能分析》.docx《卷积编码与解码的MATLAB实现及性能分析》.docx《卷积编码与解码的MATLAB实现及性能分析》.docx《卷积编码与解码的MATLAB实现及性能分析》.docx《卷积编码与解码的...
在C语言中实现哈夫曼编码与解码,主要分为以下几个步骤: 1. **创建哈夫曼树**: - 首先,我们需要收集输入数据的频率,如字符出现的次数。 - 然后,将这些频率作为权重,创建一个优先队列(通常用最小堆实现)。...
json编码与解码json编码与解码json编码与解码json编码与解码json编码与解码json编码与解码json编码与解码
哈夫曼编码(Huffman Coding),是一种熵编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般...
RLE编码与解码算法及其过程是数据压缩领域的一个基础且实用的技术。它通过简洁的方法减少数据中的冗余部分,尤其在处理那些具有大量连续重复元素的数据序列时表现出色。本文将对RLE编码与解码算法的过程进行详细介绍...
C语言是一种强大的编程语言,用于编写这样的编码和解码函数是非常合适的。以下是对曼彻斯特编码和解码的详细解释: 1. **曼彻斯特编码过程**: - 每一位数据被分成两个相等的时间段。 - 如果原始数据位是0,...
本文将深入探讨C++中JPEG图像的编码与解码过程,以及相关的技术要点。 首先,理解JPEG编码的核心是离散余弦变换(Discrete Cosine Transform, DCT)。DCT将图像数据从空间域转换到频率域,使得高频信息更容易被压缩...
huffman编码与解码附带数据结构答案
在C语言中实现哈夫曼编码与解码的过程包括几个关键步骤:构造哈夫曼树、生成哈夫曼编码、编码文件和解码文件。 1. 构造哈夫曼树: - 首先,统计输入文本中每个字符出现的频率。 - 然后,创建一个最小堆(优先队列...
总的来说,Base64编码与解码技术在现代网络通信中扮演着重要角色,特别是在处理包含非ASCII字符集的数据时,如中文字符。这个"完美支持中文"的Base64工具通过高效和准确的实现,为开发者提供了一种可靠的解决方案,...
本文将详细讲解如何在Java环境中实现TLV的编码与解码,并结合提供的`ber-tlv`资源进行分析。 TLV结构简单明了,由三个部分组成: 1. **Tag**:标识数据的类型或者含义,通常是一个整数。 2. **Length**:表示Value...
《码书:编码与解码的战争》是一本深入探讨编码与解码技术的书籍,主要聚焦于计算机科学中的编码理论及其在实际应用中的战争。这本书可能是为Java开发者或者对编码感兴趣的读者准备的,因为其标签明确指向了“java”...
在本文中,我们将深入探讨如何使用C语言实现SMS消息的编码和解码,特别是7-bit编码和解码,以及UCS2编码。首先,我们关注7-bit编码和解码算法。 7-bit编码是一种用于SMS(Short Message Service)的编码方式,它...
C++作为一门强大的系统级编程语言,虽然没有内置的URL编码和解码函数,但开发者可以借助标准库和第三方库来实现这些功能。本文将深入探讨C++中如何进行URL编码和解码。 URL(Uniform Resource Locator)是互联网上...
使用文件名为"在线PDU格式编码_解码 使用AT指令发送中文短信.html"的文件,用户可以访问到主要的使用界面,而"在线PDU格式编码_解码 使用AT指令发送中文短信_files"文件则包含了与界面展示和功能实现相关的辅助文件...
在MATLAB中实现算术编码和解码是一项涉及到概率论、数字表示和算法设计的技术工作。下面将详细介绍算术编码的基本原理、实现过程以及如何在MATLAB中应用。 算术编码的工作原理基于概率模型。假设我们有一串数据,如...