2009-12-06 40 views
0

基本上,我正在爲實驗目的構建一個小跟蹤器。我已經走得很遠了,現在正在開發部分。從UrlEncoded查詢字符串計算info_hash

我真的搞不清楚是如何解碼提供的info_hash查詢字符串。

從規範,它是一個 url編碼20字節的SHA1哈希,這讓我寫這樣的代碼,

byte[] foo = Encoding.Default.GetBytes(HttpUtility.UrlDecode(infoHash)); 
string temp = ""; 

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

其中給出 '臨時' 下面的值,

5D3F3F3F3F5E3F3F3F153FE4033683F55693468 

第一個和最後幾個字符是正確的。這是原始info_hash,

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

而這正是uTorrent的和我自己都跟蹤器給了我作爲info_hash從torrent文件生成它的時候,

5D96B6F6845EEADAC515C40E403368B955693468 

我在做什麼錯?

回答

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 2009-12-06 17:03:46

+0

沒關係,我去了context.Request.Query路線。猜猜我必須從那裏解析它。謝謝! – Viktor 2009-12-06 17:08:03