2011-02-02 75 views
3

我需要通过Play Framework在GET请求中获取二进制数据。这用于从BitTorrent客户端获取info_hash。在Play Framework中获取二进制HTTP GET参数

我得到这样的:

byte[] infoHash = params.get("info_hash").getBytes("ISO-8859-1") 

不幸被取代的0x3F所有非ASCII符号。

P.S.我可以从Http.Request.current()。querystring获取url编码参数,但这是一个坏主意。

更新:我重写play.data.parsing.UrlEncodedParser.parse(InputStream is)方法与我的变种,其中常用的ISO-8859-1的参数,而不是硬编码的UTF-8在原有的所有工作,因为它应该。但我仍然在寻找更好的方法,因为我不想编辑框架源代码。

+0

为什么不使用POST代替GET? – fmucar 2011-02-03 11:54:22

+0

BitTorrent客户端只使用GET请求给播音员。 – lafayette 2011-02-03 11:56:42

回答

1

根据http://wiki.theory.org/BitTorrent_Tracker_Protocol

info_hash

来自元信息文件中的info值中B编码格式的20字节的SHA1哈希。

甲SHA1总和看起来像这样:92a11182a8405cbd8d25cd3cc3334fc6155bec06

每对连续的字节中的一个字节的表示。尽管这种表示本身可能被编码,但它是而不是对info_hash字节的URL编码。

所以你需要将每一对从字符串中的字符转换为一个字节。如果你找到一个库来代替它,那就坚持下去。如果没有,请随时使用此代码:

byte[] decode(String enc) { 
    if (enc.length() % 2 != 0) throw new NumberFormatException(); 

    byte arr[] = new byte[enc.length()/2]; 
    int c = 0; 
    for (int i = 0; i < enc.length(); i += 2) { 
     arr[c++] = Integer.valueOf(enc.substring(i, i + 2), 16).byteValue(); 
    } 
    return arr; 
}