现在的位置: 首页 > 综合 > 正文

Java – 字符串和Unicode互转 – 解析小米pm.min.js

2013年10月15日 ⁄ 综合 ⁄ 共 1476字 ⁄ 字号 评论关闭

小米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错误。

小米每次的请求地址都不一样,如果在抢手机之前可以获得请求的字符串,也许就可以抢先别人获得线程...至于是否可行,就等下周二试试了。

抱歉!评论已关闭.