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

时间:2023-03-09 08:10:44
Java - 字符串和Unicode互转 - 解析小米pm.min.js

小米JS地址:

http://p.www.xiaomi.com/zt/20130313/huodong/pm.min.js

上面这个JS是小米抢手机页面的代码。和抢手机有直接关联。。

虽然我3次都没抢到红米手机,但是今天偶尔发现这么一个js文件,对文件内容比较好奇,但是这个js开头有个数组,部分截图如下:

Java - 字符串和Unicode互转 - 解析小米pm.min.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代码执行结果一样):

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

这段代码中,最明显的应该就是:

http://tc.hd.xiaomi.com/hdget?callback=hdcontrol&_=

这段代码在后续点击按钮时,发送的请求就是这个。

小米抢手机,好像是在服务器上限制了几百个线程,如果你正好抢到一个线程,你就进入了。如果抢不到,服务器返回一个503错误。

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