解析torrent文件 - 散列信息。 (Erlang)

问题描述:

我想要拿出正确的url编码信息哈希发送给跟踪器,以获得对等列表。解析torrent文件 - 散列信息。 (Erlang)

为了测试,我试着解析了在this url的洪流。

打开文件后,手动剪切信息词典件和SHA1哈希它的价值我得到这个二进制值:

< < 84,124,15,255,155,171,156,168,91,46,204,24,249,116,110, 139,202,167,163,54 >>

从后面的二进制值中检索到的ASCII字符串是788f590f28a799cc1009a9b780b649fd6f0a2e91,它与网站中提到的值相同。

因此,让我们假设一切都是正确的,直到现在(是不是?)。

使用URL编码功能下面我得到编码的二进制值后 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)]. 

是上述错误的功能是什么?当谈到原始数据处理时,我是一个新手。所以帮助/想法非常感谢!谢谢!

请注意,URL编码在erlang中已经可用(尽管隐藏得很好)。

1> B = <<84,124,15,255,155,171,156,168,91,46,204,24,249,116,110, 139,202,167,163,54>>. 
<<84,124,15,255,155,171,156,168,91,46,204,24,249,116,110, 
2> L = erlang:binary_to_list(B). 
[84,124,15,255,155,171,156,168,91,46,204,24,249,116,110,139, 
202,167,163,54] 
3> edoc_lib:escape_uri(L). 
"T%7c%f%c3%bf%c2%9b%c2%ab%c2%9c%c2%a8%5b.%c3%8c%18%c3%b9tn%c2%8b%c3%8a%c2%a7%c2%a36" 

它会产生与您的结果相同的结果。

+0

我试过使用escape_uri(),它给出了一个“uTorrent”发送给跟踪器的不同结果,所以我试着实现我自己的目的,看看我能否得到正确的值。如果这是给定二进制的正确编码,那么如何将值发送到跟踪器是不同的? – Smokie 2010-11-08 16:04:37

您的问题不在于您的编码器,而是您对数据的初步猜测。我们有字符串为“788f590f28a799cc1009a9b780b649fd6f0a2e91”,所以我们写的二郎山代码一点点将此转换为二进制表示形式为一个列表:

part([]) -> []; 
part([U,L | R]) -> 
    [{list_to_integer([U], 16), 
     list_to_integer([L], 16)} | part(R)]. 

现在,要求在提示中给出了:

([email protected])16> etorrent_utils:build_encoded_form_rfc1738([U*16+L || {U,L} <- foo:part("788f590f28a799cc1009a9b780b649fd6f0a2e91")]). 
"x%8FY%0F%28%A7%99%CC%10%09%A9%B7%80%B6I%FDo%0A.%91" 

匹配预期。您应该检查手动选取infohash及其SHA1计算是否按预期工作。因为你的SHA1二进制文件与它不匹配。