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.append(iTemp);}btInfo.setValue(key, itempBuilder.toString());break;case '0': case '1': case  '2': case '3': case '4': case  '5': case '6': case '7': case '8': case '9':strLengthBuilder.append(temp);break;case ':':int strLen = Integer.parseInt(strLengthBuilder.toString());strLengthBuilder = new StringBuilder();byte[] tempBytes = new byte[strLen];is.read(tempBytes);if (key != null && key.equals("pieces")) {btInfo.setValue(key, tempBytes);} else {String tempStr = new String(tempBytes);if (BitTorrentInfo.keyList.contains(tempStr)) {key = tempStr;if (tempStr.equals("announce-list")) {btInfo.setAnnounceList(new LinkedList<String>());} else if (tempStr.equals("info")) {btInfo.setInfo(new Info());} else if (tempStr.equals("files")) {btInfo.getInfo().setFiles(new LinkedList<Files>());btInfo.getInfo().getFiles().add(new Files());} else if (tempStr.equals("length")) {List<Files> tempFiles = btInfo.getInfo().getFiles();if (tempFiles != null) {if (tempFiles.isEmpty() || tempFiles.get(tempFiles.size() - 1).getLength() != 0) {tempFiles.add(new Files());}}} else if (tempStr.equals("md5sum")) {List<Files> tempFiles = btInfo.getInfo().getFiles();if (tempFiles != null) {if (tempFiles.isEmpty() || tempFiles.get(tempFiles.size() - 1).getMd5sum() != null) {tempFiles.add(new Files());}}} else if (tempStr.equals("path")) {List<Files> tempFilesList = btInfo.getInfo().getFiles();if (tempFilesList.isEmpty()) {Files files = new Files();files.setPath(new LinkedList<String>());tempFilesList.add(files);} else {Files files = tempFilesList.get(tempFilesList.size() - 1);if (files.getPath() == null) {files.setPath(new LinkedList<String>());}}}} else {btInfo.setValue(key, tempStr);}}break;}}return btInfo;}public static void main(String[] args) throws Exception {System.out.println(parse("E://【BT吧】[1080p]-鲁滨逊漂流记-Robinson Crusoe-1.73GB.torrent"));}
}

beam申明

最外层BitTorrentInfo

package org.hanmeis.bt.bean;import java.util.Arrays;
import java.util.List;/*** Created by zhao.wu on 2016/12/8.*/
public class BitTorrentInfo {public static List<String> keyList;static{String[] keys = {"announce", "announce-list", "creation date", "comment", "created by","info", "length", "md5sum", "name", "piece length","pieces", "files", "path"};keyList = Arrays.asList(keys);}private String announce;private List<String> announceList;private long creationDate;private String comment;private String createBy;private Info info;public BitTorrentInfo() {}//getter and setter  and tostringpublic void setValue(String key, Object value) throws Exception {if(!keyList.contains(key)){throw new Exception("not contains this key: " + key);}else{switch (key){case "announce":this.setAnnounce(value.toString());break;case "announce-list":this.getAnnounceList().add(value.toString());break;case "creation date":this.setCreationDate(Long.parseLong(value.toString()));break;case "comment":this.setComment(value.toString());break;case "created by":this.setCreateBy(value.toString());break;case "length":List<Files> filesList1 = this.getInfo().getFiles();if(filesList1 != null){Files files = this.getInfo().getFiles().get(filesList1.size()-1);files.setLength(Long.parseLong(value.toString()));}else {this.getInfo().setLength(Long.parseLong(value.toString()));}break;case "md5sum":List<Files> filesList2 = this.getInfo().getFiles();if(filesList2 != null){Files files = this.getInfo().getFiles().get(filesList2.size()-1);files.setMd5sum(value.toString());}else {this.getInfo().setMd5sum(value.toString());}break;case "name":this.getInfo().setName(value.toString());break;case "piece length":this.getInfo().setPiecesLength(Long.parseLong(value.toString()));break;case "pieces":this.getInfo().setPieces((byte[])value);break;case "path":List<Files> filesList3 = this.getInfo().getFiles();Files files3 = filesList3.get(filesList3.size()-1);files3.getPath().add(value.toString());break;}}}
}

第一层Info

package org.hanmeis.bt.bean;import java.util.Arrays;
import java.util.List;/*** Created by zhao.wu on 2016/12/8.*/
public class Info{private String name;private byte[] pieces;private long piecesLength;private long length;private String md5sum;private List<Files> files;public Info() {}//getter and setter  and tostring
}

第二层Files

package org.hanmeis.bt.bean;import java.util.List;/*** Created by zhao.wu on 2016/12/8.*/
public class Files{private long length;private String md5sum;private List<String> path;public Files() {}//getter and setter  and tostring
}

Java实现BT种子解析相关推荐

  1. # 解析bt文件_磁力链接和BT种子使用方法

    目前用的最多的是磁力链接和BT种子,不过好多人并不太会使用,因此写个教程给大家说明一下. 何为磁力链接:简单地说,磁力链接是一种特殊链接,但是它与传统基于文件的位置或名称的普通链接(如http://x ...

  2. B编码与BT种子文件分析,以及模仿json-cpp写一个B编码解析器

    B编码与BT种子文件分析,以及模仿json-cpp写一个B编码解析器 1.什么是B编码 2.B编码格式 3.种子文件结构 3.1.主文件结构 3.2.info结构 4.简单的例子了解一下种子文件和B编 ...

  3. python下载bt文件_python获取bt种子的详细信息

    bt种子具体文件结构如下: 全部内容必须都为bencoding编码类型. 整个文件为一个字典结构,包含如下关键字 announce:tracker服务器的URL(字符串) announce-list( ...

  4. python之bt种子,dht网络共享热门资源

    最近研究了dht网络,使用python写了个爬虫程序,另外用php做了个搜索网站,今天又把sphinx加上了,这样就是一个简单的bt种子搜索引擎了哈,网址:http://bt.dianfenxiang ...

  5. 使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)

    直接上程序界面,了解整体工作流程是什么样子的,求服务器进行挂机测试,需要固定IP,空间大概需要10G左右(主要是BT种子占用空间过大),最好有SQLSERVER来做为存储数据库,目前采用的是ACCES ...

  6. 网络资源下载方式:http/https、ftp/sftp、BT种子、磁力下载、ed2k下载等的区别

    文章目录 参考资料 序言 中心化下载 http/https下载 ftp/sftp下载 http与ftp下载方式的不同 中心化下载的缺点 去中心化下载 BT种子下载 磁力下载 ed2k下载 推荐的下载器 ...

  7. 一文读懂Bt种子、磁力链接、直链、p2p这些下载的区别

    什么是直链 什么是Bt种子 什么是磁力 什么是p2p 它们有什么区别,原理分别是什么 我们先说什么是直链 直链就是直接从服务器下载数据 他是我们日常生活中最最最常见的下载方式 我们从应用商店下载软件 ...

  8. Exception in thread main java.lang.Error: 无法解析的编译问题: 方法 main 不能声明为 static;只能在静态类型或顶级类型中才能声明静态方法

    Exception in thread "main" java.lang.Error: 无法解析的编译问题: 方法 main 不能声明为 static:只能在静态类型或顶级类型中才 ...

  9. 四种Java线程池用法解析

    四种Java线程池用法解析 本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 ...

  10. 你所需要的java基础篇深入解析大汇总

    java基础篇深入解析大总结 java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规则 java基础(三) 加强型for循环与Iterator java基础(四) java运算顺序 ...

最新文章

  1. 安装nginx及依赖包
  2. iOS开发-Runtime详解(简书)
  3. poj3666(DP+离散化)
  4. android 拷贝文件到其他目录下
  5. 《视频直播技术详解》系列之二:采集
  6. 如何查看某个用户指定时间段的ABAP开发记录
  7. 主成分分析法_数学建模 || 葡萄酒的评价(1)主成分分析法
  8. java string 转 inputstream_String和inputstream互转【转文】
  9. Java设计模式(13)----------代理模式
  10. error while loading shared libraries: libstdc++.so.6
  11. 上海淘财经网要道歉客户的信
  12. windows预口体验成员内口版本遇到问题需要重启 终止代码:IRQL_NOT_LESS_OR_EQUAL 绿屏 蓝屏 电脑崩溃 的解决方案
  13. 进阶篇:3.4.1)机械加工件-不同制造工艺详解和对应设备
  14. SVN不同分支代码合并
  15. 萤火小程序商城(YoShop)
  16. 用计算机画画的图片,儿童电脑画画大全图片
  17. Android Parcel对象详解
  18. 孩子该不该学编程?学编程有用吗?
  19. 【智能商业】看十年·曾鸣书院公开课:未来的商业是智能商业
  20. java 风的角度转风向

热门文章

  1. 云宏大讲坛 | 灵活轻便的云宏CNware虚拟防火墙
  2. 免费报表工具 - RDP报表工具
  3. ITIL 4 知识系列之服务目录
  4. DeepFake捏脸真假难辨,汤姆·克鲁斯比本人还像本人!
  5. Cent 6.5中安装NFS、Rpcbind 实现共享主机文档。
  6. Android开发的经典入门教材和学习路线
  7. 超级实用且不花哨的js代码大全 (六) ----代码判断,幻灯片播放器,广告效果
  8. 微计算机最常用的输入法,输入无极限 最常用五款拼音输入法横评
  9. 基于Linux系统开发在线词典
  10. ENVI计算不同轨道号范围中的平均高程