gpt4 book ai didi

java - 无效的 info_hash(Java BitTorrent 客户端)

转载 作者:行者123 更新时间:2023-12-01 05:02:25 24 4
gpt4 key购买 nike

根据规范:http://wiki.theory.org/BitTorrentSpecification

info_hash: urlencoded 20-byte SHA1 hash of the value of the info key from the Metainfo file. Note that the value will be a bencoded dictionary, given the definition of the info key above.

torrentMap 是我的字典,我得到另一个字典的 info 键,我计算哈希值并对其进行URLencode

但是当我尝试将其发送到跟踪器时,我总是收到invalid info_hash消息。

这是我的代码:

    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();
}

最佳答案

这几乎肯定是问题所在:

out = new ObjectOutputStream(bos);
out.writeObject(torrentMap.get("info"));

您要散列的是 torrentMap.get("info") 值的 Java 二进制序列化格式。我很难相信所有 BitTorrent 程序都应该知道这一点。

从规范中我并不清楚“info”键的值是什么意思,但您需要找出其他方法将其转换为字节数组。如果它是一个字符串,我希望有一些明确指定的编码(例如 UTF-8)。如果它已经是二进制数据,则直接使用该字节数组。

编辑:实际上,根据您的引用,该值听起来像是一个“bencoded 字典”,看起来它将是一个字符串。在对字符串进行哈希处理之前,您应该如何对该字符串进行编码(例如,听起来可能包含非 ASCII 格式的值)。当然,如果您的示例字符串都是 ASCII,那么使用“ASCII”和“UTF-8”作为 String.getBytes(...) 的编码名称无论如何都会给出相同的结果。 .

关于java - 无效的 info_hash(Java BitTorrent 客户端),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13214371/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com