Я пытаюсь найти правильный хеш-код информации для отправки трекеру, чтобы получить список пиров.
Для тестирования я попытался разобрать торрент в этом 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)].
Является ли вышеуказанная функция неправильной? Я новичок, когда дело доходит до обработки необработанных данных. так что помощь / идеи очень ценятся! Спасибо!