0

基本上,我正在构建一个用于实验目的的小型跟踪器。我已经走了很远,现在正在处理公告部分。

我真的不知道我应该如何解码提供的 info_hash 查询字符串。

从规范来看,它是一个urlencoded 20-byte SHA1 hash,这让我写了这段代码,

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 和我自己的跟踪器在从 torrent 文件生成它时给我的 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 回答