2011-02-02 14 views
3

Play FrameworkによってGETリクエストでバイナリデータを取得する必要があります。これは、BitTorrentクライアントからinfo_hashを取得するために使用されます。Play FrameworkでバイナリHTTP GETパラメータを取得する

私はこのようにそれを得る:0x3fのに置き換え

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

残念ながら、すべての非ASCII記号。

P.S.私はHttp.Request.current()。クエリーストリングからURLエンコードされたパラメータを取得できますが、これは悪い考えです。

更新:私はメソッドをオリジナルでのようにハードコードされたUTF-8の代わりにパラメータでISO-8859-1を使用しています。しかし、私はフレームワークソースを編集したくないので、より良い方法を探しています。 http://wiki.theory.org/BitTorrent_Tracker_Protocolによると

+0

なぜGETではなくPOSTを使用しますか? – fmucar

+0

BitTorrentクライアントはアナウンサーに対してのみGET要求を使用します。 – lafayette

+0

play.data.parsing.UrlEncodedParser.parseメソッドを使用する必要がありますが、このクラスではUTF-8の代わりにASCIIエンコーディングを使用してください。 – lafayette

答えて

1

info_hash

メタ情報ファイルから情報値のbencoded形式の20バイトのSHA1ハッシュ。 92a11182a8405cbd8d25cd3cc3334fc6155bec06

バイトの表現でバイトの連続した各ペア:

SHA1の合計は次のようになります。この表現自体はエンコードされていますが、ではなくで、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; 
} 
+0

あなたは間違っています。これは20バイトのURLをエンコードしたものです。 – lafayette

関連する問題