2009-06-18 3 views
3

토런트에 대해 info_hash 값을 계산하려고합니다.Java with bittorent info_hash 계산

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

내가 올바른 해시를 얻을 수없는 것 : 나는 다음과 같이 잘라, StringBuffer으로 전체 토런트를 참조하십시오. 토런트를 StringBuffer으로 읽는다면 결국 바이트 문자열이 손상됩니까? 내가 놓친 게 있니?

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

다른 질문에 따라 답을 얻을 수 있습니다. 내가 똑같은 일을하려고 할 때 그게 뭔지 알고 싶습니다. – BobMcGee

+0

내가 해결 한 방법은 파일에서 바이트를 읽으면서 해시를 계산하는 것이 었습니다. 그것을 문자열로 읽은 다음 그것을 계산한다면. 그것은 작동하지 않습니다 무언가가 손상 도착. 디스크에서 파일을 읽는 동안 계산하십시오. 귀하의 디코더 클래스에. –

답변

0

Azureus의 소스 코드를 잡고 어떻게 수행하는지 볼 수 있습니다.

1

이 경우 올바른 알고리즘을 모르지만 String에서 getBytes()를 호출 할 때마다 코드 관점에서 항상 문자 집합을 지정해야합니다. 그렇지 않으면 자주 사용되지 않는 시스템 기본값이 사용됩니다 당신이 원하는. 그것을 다음으로 대체하십시오 :

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

그리고 도움이되는지 확인하십시오.