: http://wiki.theory.org/BitTorrentSpecification잘못된 info_hash (자바 비트 토런트 클라이언트)
info_hash는 다음 메타 정보 파일에서 정보를 키 값의 20 바이트 SHA1 해시를 urlencoded를. 위의 정보 키의 정의가 주어지면 값은 bencoded 사전이됩니다.
토런트 맵은 다른 사전 인 "정보"키를 얻습니다. 해시를 계산하고 URL 인코딩합니다. 하지만 트래커에 보내려고 할 때 항상 잘못된 info_hash 메시지가 표시됩니다.
out = new ObjectOutputStream(bos);
out.writeObject(torrentMap.get("info"));
뭘 해싱 될거야 것은 값의 자바 바이너리 직렬화 형식입니다 :
public String GetInfo_hash() {
String info_hash = "";
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
try {
out = new ObjectOutputStream(bos);
out.writeObject(torrentMap.get("info"));
byte[] bytes = bos.toByteArray(); //Map => byte[]
MessageDigest md = MessageDigest.getInstance("SHA1");
info_hash = urlencode(md.digest(bytes)); //Hashing and URLEncoding
out.close();
bos.close();
} catch (Exception ex) { }
return info_hash;
}
private String urlencode(byte[] bs) {
StringBuffer sb = new StringBuffer(bs.length * 3);
for (int i = 0; i < bs.length; i++) {
int c = bs[i] & 0xFF;
sb.append('%');
if (c < 16) {
sb.append('0');
}
sb.append(Integer.toHexString(c));
}
return sb.toString();
}
** torrentMap.get ("info") **는 Object를 반환하고 HashMap에 캐스팅 할 수 있습니다. 당신이 말한대로 내가 방법을 변경 : ** 반환 urlencode (torrentMap.get ("info"). toString(). getBytes (Charset.forName ("UTF-8"))); **하지만 여전히 제공 나 뭔가 잘못 됐어. ( – Simone
@ Simone : 글쎄, * HashMap이라면, 문자열을 bencoding 형식으로 가져와야한다. 왜냐하면 그것이 해시 될 것이기 때문이다. 자신의 BT API를 처음부터 수정하거나 기존 API를 적용 할 수 있습니다. * 그러나 * bencoding 지원이 필요합니다. –
Snark 클라이언트를 다운로드하고 모든 것을 해결했습니다. ^^ – Simone