多年来,我一直在尝试让 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
。
我已经尝试使用两个不同的库进行编码,所以它可能不存在问题所在。
编辑:从规范看来,信息字典应该被 urlencoded 为 info_hash。所以我尝试将字典写成 a ByteArrayOutputStream
,然后对所持有的进行 sha1byte[]
散列ByteArrayOutPutStream
。
该DigestUtils.sha1
方法会提供 URL 编码器吗?找不到这方面的任何信息。