【问题标题】:Invalid info_hash (Java BitTorrent client)无效的 info_hash(Java BitTorrent 客户端)
【发布时间】:2012-11-03 23:03:01
【问题描述】:

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

info_hash:来自 Metainfo 文件的 info 键值的 urlencoded 20 字节 SHA1 哈希。请注意,根据上面 info 键的定义,该值将是一个经过编码的字典。

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

【问题讨论】:

    标签: java sha1 bittorrent


    【解决方案1】:

    这几乎肯定是问题所在:

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

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

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

    编辑:实际上,根据您的报价,听起来该值将是一个“编码字典”,看起来它将是一个字符串。在散列可供抓取之前,您打算如何对该字符串进行编码(例如,这听起来可能包括不在 ASCII 中的值)。如果您的示例字符串都是 ASCII,那么使用“ASCII”和“UTF-8”作为String.getBytes(...) 的编码名称无论如何都会得到相同的结果,当然......

    【讨论】:

    • torrentMap.get("info") 返回一个 Object 并且可以转换为 HashMap。根据你所说,我将方法更改为: return urlencode(torrentMap.get("info").toString().getBytes(Charset.forName("UTF-8"))); 但是它仍然给我一些错误:(
    • @Simone:如果它真的HashMap,你需要把它变成一个编码形式的String——因为那是要被散列的。目前尚不清楚您是尝试从头开始创建自己的 BT API,还是调整现有的 API - 但您将需要编码支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2020-07-25
    • 2017-01-19
    相关资源
    最近更新 更多