2010-11-08 7 views
5

Ich versuche, den korrekten URL-kodierten Info-Hash zu finden, der an den Tracker gesendet wird, um die Peers-Liste zu erhalten.Parsen einer Torrent-Datei - Hash-Info. (Erlang)

Zum Testen habe ich versucht, den Torrent in this url zu analysieren.

Nach dem Öffnen der Datei schneiden manuell die Info-Wörterbuch Stück und SHA1-Hash ist es 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 >>

Die ASCII-Zeichenfolge, die aus dem letzteren binären Wert abgerufen wird, ist 788f590f28a799cc1009a9b780b649fd6f0a2e91, und es ist derselbe Wert, der auf der Site erwähnt wird.

Also nehmen wir an, dass bis jetzt alles korrekt ist (oder?).

Nach dem Codieren des binären Werts mit der unten stehenden URL-Codierungsfunktion wird T% 7c% 0f% ff% 9b% ab% 9c% a8% 5b.% Cc% 18% f9tn% 8b% ca% a7% a36, das nicht einmal nahe dem korrekten urlencodierten Wert ist, den ich an den Tracker senden sollte. (Ich erhalte eine nicht gefundene Fehlermeldung, wenn ich diese an den Tracker sende, und sie stimmt nicht mit dem Wert überein, den ich mit wireshark erhalte, nämlich x% 8fY% 0f% 28% a7% 99% cc% 10% 09% a9 % b7% 80% b6I% fdo% 0a.% 91).

Die URL Encoding Funktion Ich verwende:

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 Neuling, wenn es um die Handhabung von Rohdaten geht. So werden Hilfe/Ideen sehr geschätzt! Vielen Dank!

Antwort

1

Beachten Sie, dass die URL-Codierung bereits in Erlang 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 das gleiche Ergebnis wie Ihres.

+0

Ich versuchte es mit Escape_uri(), die ein anderes Ergebnis als die eine "uTorrent" an den Tracker sendet, also habe ich versucht, meine eigene zu implementieren, um zu sehen, ob ich den richtigen Wert bekommen konnte. Wenn dies die richtige Kodierung der gegebenen Binärdatei ist, wie kommt es dann, dass der Wert, der an den Tracker gesendet wird, anders ist? – Smokie

1

Ihr Problem ist nicht mit Ihrem Encoder, sondern mit Ihrer ersten Schätzung der Daten. Der String wir haben, ist „788f590f28a799cc1009a9b780b649fd6f0a2e91“, so schreiben wir ein bisschen von Erlang Code 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, gibt:

([email protected])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" 

Anpassung der erwarteten. Sie sollten überprüfen, ob Ihre manuelle Auswahl des InfoShash und seiner SHA1-Berechnung so funktioniert, wie Sie es erwarten. Weil deine SHA1-Binärdatei nicht mit ihr übereinstimmt.