Frage

Ich versuche, mit dem richtigen URL-kodierten Informationen Hash zu entwickeln, um den Tracker zu senden, um die Peers Liste zu erhalten.

Für den Test habe ich versucht, die Flut in Diese URL .

Nach dem Öffnen der Datei schneiden manuell die Info-Wörterbuch Stück und SHA1-Hash es den Wert ich diesen binären Wert erhalten:

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

Das ASCII-String von diesem binären Wert abgerufen ist 788f590f28a799cc1009a9b780b649fd6f0a2e91, und es ist der gleiche Wert in der Website erwähnt.

Nehmen wir also an alles bis jetzt korrekt ist (ist es nicht?).

Nach der Codierung des binären Wertes mit der URL-Kodierung Funktion unten ich T% 7c% 0F% FF% 9b% ab% 9c% a8% 5b.% Cc% 18% f9tn% 8b% ca% a7% A36, die an den richtigen urlencoded Wert nicht einmal in der Nähe ist, dass ich an den Tracker senden soll . (Ich erhalte eine nicht-gefunden Fehlermeldung, wenn ich diese an den Tracker senden, plus, es ist nicht auf den Wert angepasst I wireshark siehe unter Verwendung der x% ist 8FY% 0f% 28% a7% 99% kWk% 10% 09% a9 % b7% 80% B6I% FDO% 0a.% 91).

Die URL Encoding Funktion Ich bin mit:

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)].

Ist die Funktion oben falsch? Ich bin eine Art von einem Neuling, wenn es roh-Datenverarbeitung kommt. so Hilfe / Ideen sind sehr willkommen! Dank!

War es hilfreich?

Lösung

Beachten Sie, dass URL-Codierung in erlang bereits verfügbar ist (wenn auch gut versteckt).

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"

Es ergibt sich das gleiche Ergebnis wie bei Ihnen.

Andere Tipps

Ihr Problem ist nicht mit dem Encoder aber mit Ihrer ersten Schätzung auf den Daten. Der String wir haben, ist „788f590f28a799cc1009a9b780b649fd6f0a2e91“, so dass wir ein wenig von Erlang Code schreiben dies als eine Liste seiner binären Darstellung zu konvertieren:

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

Nun, in einer Abfrage, ergibt sich:

(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"

Die Anpassung des erwartet. Sie sollten überprüfen, ob Ihre manuelle Kommissionierung des infohash und seine SHA1 Berechnung funktioniert, wie Sie es Arbeit erwarten. Da Ihr SHA1 binären es stimmt nicht überein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top