承接上文,使用递归可以很简单的就实现了一个bencode编码函数
package com.norkts.torrents;
import org.junit.Assert;
import java.util.*;
/**
* bencode文件编码
* @author norkts<norkts@gmail.com>
* @date 2017-06-23
* @version 1.0
*/
public class Bencoder {
/**
* 将对象使用bencode格式编码
* @param target
* @return
*/
public static String encode(Object target){
StringBuilder sb = new StringBuilder();
if(target instanceof Map){
//字典类型
sb.append("d");
for(Map.Entry<String, Object> entry : ((Map<String, Object>)target).entrySet()){
String key = entry.getKey();
Object value = entry.getValue();
sb.append(encode(key));
sb.append(encode(value));
}
sb.append("e");
}else if(target instanceof List){
//列表类型处理
sb.append("l");
for(Object item : (List<Object>)target){
sb.append(encode(item));
}
sb.append("e");
}else if(target instanceof String){
//字符串类型处理
sb.append(((String)target).length() + ":" + target);
}else{
//数字处理
sb.append("i" + Integer.toString((Integer)target, 10) + "e");
}
return sb.toString();
}
public static void main(String[] argv){
Object target = new LinkedHashMap<String, Object>();
((Map<String, Object>)target).put("a", "1");
((Map<String, Object>)target).put("b", 2);
((Map<String, Object>)target).put("c", -3);
Assert.assertEquals("d1:a1:11:bi2e1:ci-3ee", encode(target));
target = new LinkedHashMap<String, Object>();
((Map<String, Object>) target).put("key1", "val1");
((Map<String, Object>) target).put("key2", 100);
List<Object> li = new ArrayList<Object>();
li.add("item1");
li.add(-100);
li.add(((ArrayList<Object>) li).clone());
li.add(((LinkedHashMap<String, Object>) target).clone());
((Map<String, Object>) target).put("key3", li);
System.out.println(encode(target));
Assert.assertEquals("d4:key14:val14:key2i100e4:key3l5:item1i-100el5:item1i-100eed4:key14:val14:key2i100eeee", encode(target));
System.out.println(BencodeDecoder.decode(encode(target).getBytes()));
}
}
分享到:
相关推荐
这就为针对Bencode编码实现的攻击提供了可能。首先构造了有一定递归深度的torrent文件以及扩展协议中的消息,实验发现对当前主流的BT客户端:比特精灵、迅雷(迷你迅雷)、比特彗星、FlashGet和TuoTu都会造成系统的...
锈本码用 rust 编写的 Bencode 编码的实现。项目状态由于缺乏时间和其他优先事项,未处于积极开发阶段。如果你有兴趣接管这个板条箱的开发,请联系我。什么是本码?它是BitTorrent文件共享系统使用的编码。更多关于...
这就为针对Bencode编码实现的攻击提供了可能。首先构造了有一定递归深度的torrent文件以及扩展协议中的消息,实验发现对当前主流的BT客户端:比特精灵、迅雷(迷你迅雷)、比特彗星、FlashGet和TuoTu都会造成系统的崩溃...
使用C++封装的Bencode解析库,DLL
本码 Go中的Bencode实现安装$ go get github.com/marksamman/bencode用法编码bencode.Encode使用map [string] interface {}作为参数,并返回一个字节数组。 例子: package mainimport ("fmt""github....
锈本码 Rust 语言中的 Bencode 解码器实现 目前它正在开发中。 更多信息即将推出
BEncode Editor
这是Bencode for Java的实现。 Bencode用于DHT,Torrent和Google DataServer。 它是一种轻量级的快速数据序列化。 基准测试 这里是与其他主要数据序列化方法相比该库的一些示例。 序列化/编码 方法 时间在米尔斯 ...
一个轻量级且快速的.NET库,用于对Bencode进行编码和解码(例如,torrent文件和BitTorrent客户端/跟踪器通信)。 该库的主要重点是支持Bencode格式。 torrent文件的读取/操作是次要的。 内容 项目状态 该项目处于...
nim-bencode:nim中的bencode编码器
Bencode一个Bencode的非标准的C++实现。特点引入null值(使用'n'表示)以状态机方式实现解析提供基于流的接口
Bencode(发音为 B encode)是点对点文件共享系统 BitTorrent 用于存储和传输松散结构化数据的编码。 它支持四种不同类型的值: 字节串 整数 列表 字典 Bencoding 最常用于 torrent 文件。 这些元数据文件只是...
资源来自pypi官网。 资源全名:torrent-bencode3-0.0.2.tar.gz
官方版本,亲测可用
BT种子很多带有广告之类 用它就能轻松编辑 不会再为烦人的广告担忧