基本上,我正在构建一个用于实验目的的小型跟踪器。我已经走得很远了,现在正在宣布宣布部分。
我真正想知道的是我应该如何解码所提供的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和我自己的跟踪器在从torrent文件生成时为我提供info_hash的内容,
5D96B6F6845EEADAC515C40E403368B955693468
我做错了什么?
答案 0 :(得分: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"
答案 1 :(得分:0)