【发布时间】:2012-10-21 17:46:06
【问题描述】:
我正在尝试提供正确的 url 编码信息哈希发送到跟踪器,以便获取对等列表。
为了测试,我尝试解析this url中的种子。
打开文件后,手动剪切信息字典片段和 SHA1-hash 它的值我得到这个二进制值:
>
从后一个二进制值中检索到的 ASCII 字符串是 788f590f28a799cc1009a9b780b649fd6f0a2e91,与网站中提到的值相同。
所以让我们假设到目前为止一切都是正确的(不是吗?)。
使用下面的 url-encoding 函数对二进制值进行编码后,我得到 T%7c%0f%ff%9b%ab%9c%a8%5b.%cc%18%f9tn%8b%ca%a7%a36 ,这甚至不接近我应该发送给跟踪器的正确urlencoded值. (当我将它发送到跟踪器时,我收到一条未找到的错误消息,另外,它与我使用 wireshark 看到的值不匹配,即 x%8fY%0f%28%a7%99%cc%10%09%a9 %b7%80%b6I%fdo%0a.%91)。
我正在使用的 URL 编码功能:
encode(<<Bin:20/binary-unit:8>>)->
%io:format("~p~n", [binary_to_list(Bin)]),
encode(binary_to_list(Bin));
encode(List) -> do_encode(List).
do_encode([])-> [];
do_encode([H|T]) when H>=$a, H=<$z ->
[H| encode(T)];
do_encode([H|T]) when H>=$A, H=<$Z ->
[H| encode(T)];
do_encode([H|T]) when H>=$0, H=<$9 ->
[H| encode(T)];
do_encode([H|T]) when H==$- ->
[H| encode(T)];
do_encode([H|T]) when H==$. ->
[H|do_encode(T)];
do_encode([H|T]) when H==$* ->
[H|do_encode(T)];
do_encode([H|T]) ->
to_hex(H) ++ encode(T).
hex(N) when N < 10 ->
$0+N;
hex(N) when N >= 10, N < 16 ->
$a+(N-10).
to_hex(N) when N < 256 ->
[$%, hex(N div 16), hex(N rem 16)].
上面的函数错了吗?在处理原始数据方面,我是一个新手。所以非常感谢帮助/想法!谢谢!
【问题讨论】:
标签: erlang bittorrent info-hash