【发布时间】:2017-07-11 19:42:04
【问题描述】:
多年来,我一直在尝试让 BitTorrent 在 Java 中工作的这种哈希方法,但它总是出错。
我已将其缩小到几行代码,我 99% 确定问题出在:
Bencode bencode = new Bencode(Charset.forName("UTF-8"));
byte[] fileBytes = new byte[33237];
Map<String, Object> dict = bencode.decode(fileBytes, Type.DICTIONARY);
Map infoMap = (Map) object.get("info");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BencodeOutputStream bos = new BencodeOutputStream(baos);
bos.writeDictionary(infoMap);
byte[] hash = DigestUtils.sha1(baos.toByteArray());
我已经硬编码了数组的大小,以确保问题不是由一堆零引起的。
UTF-8 和 US-ASCII 我都试过了。
我已经尝试使用两个不同的库进行编码,所以它可能不存在问题所在。
编辑: 从规范看来,info dict 应该被 urlencoded 为 info_hash。所以我尝试将字典写成ByteArrayOutputStream,然后对ByteArrayOutPutStream 持有的byte[] 进行sha1 哈希处理。
DigestUtils.sha1方法会提供 URL 编码器吗?找不到任何相关信息。
【问题讨论】:
-
如有疑问,请调试
-
我不知道你在做什么,但我查了the spec。是您要计算的
info_hash吗?它说应该是info的值,而不是pieces -
@thatotherguy 阅读时似乎是这样,是的。我尝试的时候没有用。在您看来,您是否会假设信息图已经进行了 sha1 编码?读起来好像是这样,但同时又很模糊。
-
信息映射被编码:“来自 Metainfo 文件的信息键值的 urlencoded 20 字节 SHA1 哈希。请注意,该值将是一个编码字典”。我如何运行您的示例?您不提供任何输入或输出数据
-
谢谢。看来我的代码现在正在解码大字典,获取解码的信息字典,对其进行编码,然后进行 sha1 散列。这似乎不是让它工作的合理流程吗?
标签: java bittorrent bencoding