Java实现BT种子解析

本文介绍了BT种子的结构,包括announce、info等关键字段,以及单文件和多文件结构的区别。并展示了Java代码实现,详细讲解了解析工具类的声明和beam的使用,涵盖了从最外层的BitTorrentInfo到内部的Files的解析过程。
摘要由CSDN通过智能技术生成

BT种子结构

  • announce:tracker服务器的URL(字符串)
  • announce-list(可选):备用tracker服务器列表(列表)
  • creation date(可选):种子创建的时间,Unix标准时间格式,从1970 1月1日 00:00:00到创建时间的秒数(整数)
  • comment(可选):备注(字符串)
  • created by(可选):创建人或创建程序的信息(字符串)
  • info:一个字典结构,包含文件的主要信息,为分二种情况:单文件结构或多文件结构(目录)
    1. 单文件结构如下:
      • length:文件长度,单位字节(整数)
      • md5sum(可选):长32个字符的文件的MD5校验和,BT不使用这个值,只是为了兼容一些程序所保留!(字符串)
      • name:文件名(字符串)
      • piece length:每个块的大小,单位字节(整数)
      • pieces:每个块的20个字节的SHA1 Hash的值(二进制格式)
    2. 多文件结构如下:
      • files:一个字典结构
      • length:文件长度,单位字节(整数)
      • md5sum(可选):同单文件结构中相同
      • path:文件的路径和名字,是一个列表结构,如”test”test.txt(列表) 列表为l4:test8test.txte
      • name:最上层的目录名字(字符串)
      • piece length:同单文件结构中相同(整数)
      • pieces:同单文件结构中相同 (二进制格式)

代码实现

解析工具类声明

package org.hanmeis.bt;

import org.hanmeis.bt.bean.BitTorrentInfo;
import org.hanmeis.bt.bean.Files;
import org.hanmeis.bt.bean.Info;

import java.io.*;
import java.util.LinkedList;
import java.util.List;

/**
 * 代码中并未采用网上现有的递归算法进行解析,而是使用键值匹配的方式。
 * 然而当前代码实现中还存在着一些bug,如键和值相同的情况。
 * 对此bug修正方法,当前的想法是创建set记录已经出现过的键值情况。
 * Created by zhao.wu on 2016/12/8.
 */
public class BitTorrents {
   
    public static BitTorrentInfo parse(File btFile) throws Exception {
        return new BitTorrents().analyze(new FileInputStream(btFile));
    }

    public static BitTorrentInfo parse(String btFilePath) throws Exception {
        return new BitTorrents().analyze(new FileInputStream(btFilePath));
    }

    private BitTorrentInfo analyze(InputStream is) throws Exception {

        BitTorrentInfo btInfo = new BitTorrentInfo();

        String key = null;
        StringBuilder strLengthBuilder = new StringBuilder();

        int tempByte;
        while ((tempByte = is.read()) != -1) {
            char temp = (char) tempByte;
            switch (temp) {
                case 'i':
                    StringBuilder itempBuilder = new StringBuilder();
                    char iTemp;
                    while ((iTemp = (char) is.read()) != 'e') {
                        itempBuilder.app
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值