Разбор торрент-файла - хэш-информация.(Эрланга) - PullRequest
5 голосов
/ 08 ноября 2010

Я пытаюсь найти правильный хеш-код информации для отправки трекеру, чтобы получить список пиров.

Для тестирования я попытался разобрать торрент в этом 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)].

Является ли вышеуказанная функция неправильной? Я новичок, когда дело доходит до обработки необработанных данных. так что помощь / идеи очень ценятся! Спасибо!

Ответы [ 2 ]

1 голос
/ 10 ноября 2010

Ваша проблема не с вашим кодировщиком, а с вашим первоначальным предположением о данных.У нас есть строка "788f590f28a799cc1009a9b780b649fd6f0a2e91", поэтому мы напишем немного кода Эрланга, чтобы преобразовать его в двоичное представление в виде списка:

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 не соответствует ему.

1 голос
/ 08 ноября 2010

Обратите внимание, что кодировка 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"

Она дает тот же результат, что и ваш.

...