5

ピアリストを取得するためにトラッカーに送信する正しいURLエンコードされた情報ハッシュを考え出そうとしています。

テストのために、この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-encoding関数を使用してバイナリ値をエンコードした後、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)].

上記の機能は間違っていますか?生データの処理に関しては、私は一種の初心者です。だからヘルプ/アイデアは大歓迎です!ありがとう!

4

2 に答える 2

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"

それはあなたと同じ結果をもたらします。

于 2010-11-08T13:58:56.867 に答える
1

問題はエンコーダーではなく、データの最初の推測にあります。私たちが持っている文字列は「788f590f28a799cc1009a9b780b649fd6f0a2e91」なので、これをリストとしてのバイナリ表現に変換するために、Erlangコードを少し記述します。

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バイナリが一致しないためです。

于 2010-11-10T02:03:02.193 に答える