erlang - 解析 torrent 文件 - 哈希信息。 (二郎)

标签 erlang bittorrent info-hash

我正在尝试提出正确的网址编码信息哈希以发送到跟踪器,以便获取对等列表。

为了测试,我尝试解析 this url 中的 torrent .

打开文件后,手动剪切信息字典片段并对其值进行 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)].

上面的函数有错吗?在原始数据处理方面,我是一个新手。所以非常感谢帮助/想法!谢谢!

最佳答案

请注意,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"

它产生与您相同的结果。

关于erlang - 解析 torrent 文件 - 哈希信息。 (二郎),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4124105/

相关文章:

networking - 如何连接到DHT引导节点?

javascript - 我已经编写了自己的 javascript Bencode 库,但仍然无法生成 torrent 信息哈希值?

java - 用java计算bittorent info_hash

java - 有没有一个可以轻松地通过 java 进行编程控制的 BitTorrent 客户端?

erlang - 错误函数子句?

erlang - 你能溢出一个 Erlang 进程的消息队列吗?

Erlang:有没有办法用 rebar 将更改的模块重新加载到已经运行的节点中?

bittorrent - uTorrent 的 uTorrentPartFile.dat 的结构

sha1 - 如何将 Bit Torrent info_hash(从 Wireshark 获得)转换为 SHA1 哈希

erlang - 为什么这个模式不匹配