2009-06-18 9 views
3

Ich versuche, den info_hash Wert für einen Torrent zu berechnen. Ich lese den ganzen Strom in StringBuffer, schneiden Sie es dann wie folgt aus:Bittorent info_hash mit Java berechnen

d8:announce...info[d6:length...e]e 

Ich kann nicht scheinen, um die richtige Hash zu bekommen. Liest das Lesen des Torrents in eine StringBuffer die Byte-Zeichenfolge am Ende? Fehle ich etwas?

public void calculateInfoHash(){ 
try{ 
    int index = rawData.indexOf("4:info") + 6; 
    int end = rawData.length() - 1; 

    String info = rawData.substring(index , end); 

    MessageDigest md = MessageDigest.getInstance("SHA"); 
    md.update(info.getBytes()); 
    byte[] digest = md.digest(); 

    for (byte b : digest) { 
    // print byte as 2 hex digits with lead 0. 
    //Separate pairs of digits with space 
    //System.out.print("%"); 
    System.out.printf("%02X", b & 0xff); 
     } 
    System.out.println(); 

}catch(Exception e) { 
    System.out.println(e.toString()); 
} 
} 
+1

Basierend auf Ihrer anderen Frage haben Sie eine Antwort. Ich würde gerne wissen, was es war, während ich versuche, das Gleiche zu tun. – BobMcGee

+0

Die Art, wie ich es gelöst habe, war, den Hash zu berechnen, während ich Bytes aus der Datei lese. Wenn Sie es in eine Zeichenfolge einlesen und dann berechnen. es funktioniert nie etwas wird beschädigt. Berechnen Sie es, während Sie die Datei von der Festplatte lesen. in Ihrer Decoderklasse. –

Antwort

0

könnten Sie greifen nur den Quellcode für Azureus und sehen, wie sie es tun.

1

Ich weiß nicht, über den richtigen Algorithmus in diesem Fall, aber aus Sicht des Codes, wenn Sie getBytes() auf einen String aufrufen, sollten Sie immer einen Zeichensatz angeben, ansonsten wird der Systemstandard verwendet, der oft nicht was du willst. Ersetzen Sie es durch:

md.update(info.getBytes("UTF-8")); 

und sehen, ob das hilft.