2010-11-08 10 views
5

मैं सहकर्मी सूची प्राप्त करने के लिए ट्रैकर को भेजने के लिए सही यूआरएल-एन्कोडेड जानकारी हैश के साथ आने का प्रयास कर रहा हूं।एक धार फ़ाइल को पार्स करना - हैश जानकारी। (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 है, और यह साइट में उल्लिखित वही मान है।

तो मान लीजिए कि अब तक सबकुछ सही है (है ना?)।

बाइनरी मान एन्कोडिंग नीचे मैं यूआरएल एन्कोडिंग समारोह इस्तेमाल करने के बाद टी% 7c% 0f% एफएफ% 9b% अब% 9c% A8% 5 ब।% सीसी% 18% f9tn% 8b% सीए% ए 7% ए 36, जो सही urlencoded मान के करीब भी नहीं है जिसे मुझे ट्रैकर को भेजना चाहिए। (जब मैं इसे ट्रैकर को भेजता हूं तो मुझे कोई त्रुटि नहीं मिलती है, साथ ही, यह वैरहार्क का उपयोग करके देखे गए मान से मेल नहीं खाता है जो x% 8fY% 0f% 28% a7% 99% सीसी% 10% 09% ए 9 है % बी 7% 80% बी 6 आई% एफडीओ% 0 ए।% 91)।

यूआरएल एन्कोडिंग समारोह मैं उपयोग कर रहा हूँ:

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

ध्यान दें कि यूआरएल-एन्कोडिंग पहले से ही एरलांग में उपलब्ध है (हालांकि अच्छी तरह छुपा हुआ है)।

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() का उपयोग करने की कोशिश की, जिसने एक "यूटोरेंट" से एक अलग परिणाम दिया, ट्रैकर को भेजता है, इसलिए मैंने यह देखने के लिए अपना खुद का कार्यान्वयन करने की कोशिश की कि क्या मुझे सही मूल्य मिल सकता है। यदि यह दिए गए द्विआधारी का सही एन्कोडिंग है तो ट्रैकर को मूल्य भेजा जा रहा है तो अलग कैसे है? – Smokie

1

आपकी समस्या आपके एन्कोडर के साथ नहीं है बल्कि डेटा पर आपके शुरुआती अनुमान के साथ है। स्ट्रिंग हमारे पास "788f590f28a799cc1009a9b780b649fd6f0a2e91" है, इसलिए हम Erlang कोड का एक छोटा सा एक सूची के रूप में अपनी द्विआधारी प्रतिनिधित्व में बदलने के लिए लिखें:

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" 

अपेक्षित मिलान। आपको यह जांचना चाहिए कि इन्फोहाश और उसके SHA1 गणना के मैन्युअल पिकिंग के रूप में आप काम करने की अपेक्षा करते हैं। क्योंकि आपकी SHA1 बाइनरी इससे मेल नहीं खाती है।

संबंधित मुद्दे