我需要通过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,并且所有方法都正常工作。但我仍然在寻找更好的方法,因为我不想编辑框架资源。
答案 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;
}