2009-12-06 4 views
0

기본적으로 실험용으로 작은 추적기를 구축하고 있습니다. 나는 꽤 멀리있어, 지금 발표 부분에 노력하고있다.UrlEncoded 쿼리 문자열에서 info_hash를 계산합니다.

내가 실제로 알아낼 수없는 것은 제공된 info_hash 쿼리 문자열을 어떻게 디코딩해야하는지입니다.

사양에서

, 그것은 날이 코드를 작성했다 20 바이트 SHA1 해시을, urlencode되고있다

'임시'다음 값을 제공
byte[] foo = Encoding.Default.GetBytes(HttpUtility.UrlDecode(infoHash)); 
string temp = ""; 

foreach (byte b in foo) 
{ 
    temp += b.ToString("X"); 
} 

,

5D3F3F3F3F5E3F3F3F153FE4033683F55693468 

첫 번째와 마지막 몇 문자가 정확합니다. 내가 잘못 뭐하는 거지

5D96B6F6845EEADAC515C40E403368B955693468 

, 이것은

%5d%96%b6%f6%84%5e%ea%da%c5%15%c4%0e%403h%b9Ui4h 

원시 info_hash입니다 그리고 이것은 토런트 파일을 생성 할 때이 uTorrent 내 자신의 추적기 모두 info_hash 나를주는 무엇인가?

답변

0

UrlDecode는 문자열을 반환하지만 (ANSI) 문자열로 해석되는 경우 SHA1 해시는 의미가 없습니다.
문자열로 왕복하지 않고 입력 문자열을 직접 바이트 배열로 디코딩해야합니다.

var s = "%5d%96%b6%f6%84%5e%ea%da%c5%15%c4%0e%403h%b9Ui4h"; 

var ms = new MemoryStream(); 
for (var i = 0; i < s.Length; i++) 
{ 
    if (s[i] == '%') 
    { 
     ms.WriteByte(
      byte.Parse(s.Substring(i + 1, 2), NumberStyles.AllowHexSpecifier)); 
     i += 2; 
    } 
    else if (s[i] < 128) 
    { 
     ms.WriteByte((byte)s[i]); 
    } 
} 

byte[] infoHash = ms.ToArray(); 
string temp = BitConverter.ToString(infoHash); 
// "5D-96-B6-F6-84-5E-EA-DA-C5-15-C4-0E-40-33-68-B9-55-69-34-68" 
+0

감사합니다! 이 예제는 매력처럼 작동하지만 하드 코딩 된 문자열을 info_hash 쿼리 문자열로 대체 할 때 모든 정보가 엉망이됩니다. var s = context.Request.QueryString [ "info_hash"] 쿼리 문자열의 문자열 값이 아니라 횡설수졸 한 문자열을 제공합니다. – Viktor

+0

신경 쓰지 마라, 나는 문맥을 따라 갔다. 내가 거기에서 파싱해야 할 것 같네. 고맙습니다! – Viktor