Calcolo info_hash da urlencoded stringa di query
Domanda
In sostanza, sto costruendo un piccolo inseguitore per scopi sperimentali. Ho ottenuto abbastanza lontano, e ora sto lavorando alla parte annunciare.
Quello che davvero non riesco a capire è come dovrei decodificare la stringa di query info_hash fornito.
Dalla specifica, si tratta di un urlencoded 20 byte hash SHA1 , che mi ha fatto scrivere questo codice,
byte[] foo = Encoding.Default.GetBytes(HttpUtility.UrlDecode(infoHash));
string temp = "";
foreach (byte b in foo)
{
temp += b.ToString("X");
}
che dà 'temp' il seguente valore,
5D3F3F3F3F5E3F3F3F153FE4033683F55693468
Il primo e l'ultimo pochi caratteri siano corretti. Questa è la cruda info_hash,
%5d%96%b6%f6%84%5e%ea%da%c5%15%c4%0e%403h%b9Ui4h
E questo è ciò che sia uTorrent e il mio inseguitore mi dà come info_hash quando si genera dal file torrent,
5D96B6F6845EEADAC515C40E403368B955693468
Che cosa sto facendo di sbagliato?
Soluzione
UrlDecode restituisce una stringa, ma un hash SHA1 non ha senso se interpretato come (ANSI) stringa.
È necessario decodificare la stringa di input direttamente a un array di byte, senza l'andata e ritorno in una stringa.
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"
Altri suggerimenti