【问题标题】:Calculating info_hash from UrlEncoded query string从 UrlEncoded 查询字符串计算 info_hash
【发布时间】:2009-12-06 16:32:17
【问题描述】:

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

我真的不知道应该如何解码提供的 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

我做错了什么?

【问题讨论】:

    标签: c# tracker info-hash


    【解决方案1】:

    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"
    

    【讨论】:

    • 谢谢!这个例子就像一个魅力,虽然当用 info_hash 查询字符串替换硬编码字符串时,它变得一团糟。 var s = context.Request.QueryString["info_hash"] 给我一串乱码,而不是查询字符串的字符串值。
    • 没关系,我选择了 context.Request.Query 路由。我想我得从那里解析它。谢谢!
    【解决方案2】:
    猜你喜欢
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    相关资源
    最近更新 更多