bencode对象编码实现

承接上文,使用递归可以很简单的就实现了一个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()));
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值