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?

È stato utile?

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"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top