Java - 字符串和Unicode互转 - 解析小米pm.min.js
小米JS地址:
http://p.www.xiaomi.com/zt/20130313/huodong/pm.min.js
上面这个JS是小米抢手机页面的代码。和抢手机有直接关联。。
虽然我3次都没抢到红米手机,但是今天偶尔发现这么一个js文件,对文件内容比较好奇,但是这个js开头有个数组,部分截图如下:
开始这么一大堆的16进制字符串,这种类型的数据经常会在properties文件中看到,为了看到实际的内容,写了如下代码进行翻译。
最简单的方式,只要把上面的代码,贴到浏览器(如chrome的console中),就可以看到还原的文字。
另一种java方式,实现很简单,因为看到上面的\x,首先想到的是16进制,看到\u首先想到的是unicode,看如下完整代码:
public class UnicodeHex { public static String decode(String str) { if(str==null||str.trim().equals("")){ return ""; } String[] ss = str.split("\\\\"); int i = 0, j = 0; int length = ss.length; char[] cs = new char[length]; for (; i < ss.length; i++) { if (!ss[i].trim().equals("")) { cs[j] = (char) (Integer.valueOf(ss[i].substring(1), 16).intValue()); j++; } } return new String(cs); } public static String encode(String str){ if(str==null||str.trim().equals("")){ return ""; } StringBuffer sb = new StringBuffer(); char c; for(int i=0;i<str.length();i++){ c = str.charAt(i); if(c > 256){ sb.append("\\u"); } else { sb.append("\\x"); } sb.append(Integer.toHexString(c)); } return sb.toString(); } public static void main(String[] args) throws Exception { String str = "\\x3c\\x2f\\x69\\x6e\\x73\\x3e\\u5c0f\\u65f6\\x3c\\x69\\x6e\\x73\\x3e"; System.out.println(decode(str)); String ss = "</ins>小时<ins>"; System.out.println(encode(ss)); System.out.println(str); } }
使用decode解析上面的字符串,使用encode转换为上述字符串。
小米这段代码都有什么呢,看如下部分内容(使用chrome,和上面java代码执行结果一样):
这段代码中,最明显的应该就是:
http://tc.hd.xiaomi.com/hdget?callback=hdcontrol&_=
这段代码在后续点击按钮时,发送的请求就是这个。
小米抢手机,好像是在服务器上限制了几百个线程,如果你正好抢到一个线程,你就进入了。如果抢不到,服务器返回一个503错误。
小米每次的请求地址都不一样,如果在抢手机之前可以获得请求的字符串,也许就可以抢先别人获得线程...至于是否可行,就等下周二试试了。