2010-11-08 126 views
5

我想要拿出正確的url編碼信息哈希發送給跟蹤器,以獲得對等列表。解析torrent文件 - 散列信息。 (Erlang)

爲了測試,我試着解析了在this 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)]. 

是上述錯誤的功能是什麼?當談到原始數據處理時,我是一個新手。所以幫助/想法非常感謝!謝謝!

回答

1

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

它會產生與您的結果相同的結果。

+0

我試過使用escape_uri(),它給出了一個「uTorrent」發送給跟蹤器的不同結果,所以我試着實現我自己的目的,看看我能否得到正確的值。如果這是給定二進制的正確編碼,那麼如何將值發送到跟蹤器是不同的? – Smokie 2010-11-08 16:04:37

1

您的問題不在於您的編碼器,而是您對數據的初步猜測。我們有字符串爲「788f590f28a799cc1009a9b780b649fd6f0a2e91」,所以我們寫的二郎山代碼一點點將此轉換爲二進制表示形式爲一個列表:

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

現在,要求在提示中給出了:

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

匹配預期。您應該檢查手動選取infohash及其SHA1計算是否按預期工作。因爲你的SHA1二進制文件與它不匹配。