2011-02-02 79 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; 
}