【问题标题】:Parsing a torrent file - hash info. (Erlang)解析 torrent 文件 - 哈希信息。 (二郎)
【发布时间】: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


    【解决方案1】:

    请注意,erlang 中已经提供了 URL 编码(尽管隐藏得很好)。

    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"
    

    它产生与你相同的结果。

    【讨论】:

    • 我尝试使用 escape_uri(),它给出了与发送到跟踪器的“uTorrent”不同的结果,所以我尝试实现自己的,看看是否可以获得正确的值。如果这是给定二进制文件的正确编码,那么发送到跟踪器的值为什么不同?
    【解决方案2】:

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

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

    现在,在提示中询问:

    (etorrent@127.0.0.1)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 二进制文件不匹配。

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多