0

基本的に、私は実験目的で小さなトラッカーを構築しています。私はかなり遠くまで行き、現在アナウンスの部分に取り組んでいます。

私が本当に理解できないのは、提供された info_hash クエリ文字列をどのようにデコードする必要があるかです。

仕様から、urlencoded 20 バイトの SHA1 ハッシュであり、このコードを書くようになりました。

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

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

これにより、「temp」に次の値が与えられます。

5D3F3F3F3F5E3F3F3F153FE4033683F55693468

最初と最後の数文字は正しいです。これは生の info_hash です。

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

これは、uTorrent と私自身のトラッカーの両方が、トレント ファイルから生成するときに info_hash として提供するものです。

5D96B6F6845EEADAC515C40E403368B955693468

私は何を間違っていますか?

4

2 に答える 2

0

UrlDecode は文字列を返しますが、SHA1 ハッシュは (ANSI) 文字列として解釈されると意味がありません。
文字列へのラウンドトリップなしで、入力文字列をバイト配列に直接デコードする必要があります。

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"
于 2009-12-06T16:47:35.447 に答える
0

HttpUtility.UrlDecodeToBytes

于 2009-12-15T04:38:49.957 に答える