在Play Framework中获取二进制HTTP GET参数

时间:2011-02-02 22:55:22

标签: java string http encoding playframework

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

我是这样的:

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

不幸的是,所有非ascii符号都被0x3f替换。

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

更新:我使用我的变体覆盖play.data.parsing.UrlEncodedParser.parse(InputStream is)方法,其中在参数中使用ISO-8859-1而不是原始的硬编码UTF-8,并且所有方法都正常工作。但我仍然在寻找更好的方法,因为我不想编辑框架资源。

1 个答案:

答案 0 :(得分:1)

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

  

info_hash

     

来自metainfo文件的信息值的bencoded形式的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;
}