package com.norkts.torrents; import org.junit.Assert; import java.util.*; /** * bencode文件编码 * @author norkts<[email protected]> * @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对象编码实现
承接上文,使用递归可以很简单的就实现了一个bencode编码函数
猜你喜欢
转载自norkts.iteye.com/blog/2381058
今日推荐
周排行