`

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
1
分享到:
评论

相关推荐

    BenCode编码解析

    **BenCode编码解析** 在IT领域,特别是在P2P网络技术中,`Bencode`是一种广泛使用的编码方式,尤其在BT(BitTorrent)文件系统中。`BenCode`设计的目标是简洁、易于实现,同时也方便计算机解析。它主要用于将数据...

    bencode.rar

    在这个上下文中,C#源码用于解析`bencode`编码的数据,实现读取和理解BT种子文件内容的功能。这可能涉及到类、方法、异常处理、IO流操作等C#核心概念。 设计模式是软件工程中解决常见问题的可复用解决方案。在解析`...

    Laravel开发-bencode

    - 使用示例代码展示如何在Laravel中实现Bencode编码和解码,以及如何在控制器、模型或服务中集成这些功能。 通过以上介绍,我们可以看出“Laravel开发-bencode”是关于在Laravel框架中使用Bencode进行数据序列化和...

    Bencode:一个非标准的 Bencode C++ 实现

    Bencode是一种数据序列化格式,主要被BitTorrent协议用于文件元数据的编码。它的设计简洁明了,易于解析和生成,适合在网络传输中处理大量数据。Bencode的基本数据类型包括整数、字符串、列表和字典。 在本文中,...

    Laravel开发-bencode .zip

    在本压缩包“Laravel开发-bencode .zip”中,主要涵盖了使用 Laravel 框架进行Web应用开发的相关内容,特别是关于Bencode编码的运用。Laravel是一款基于PHP的开源框架,它以其优雅的语法、强大的功能和丰富的生态...

    bencode-SerDe:Java 中的 Bencode 序列化和反序列化

    1. **编码**:将Java对象(如数字、字符串、列表和映射)转换为Bencode格式的字节序列。这可能涉及递归地处理复杂的数据结构,确保每个元素都按照Bencode规范正确编码。 2. **解码**:将Bencode格式的字节序列或字符...

    QBencode:Qt 中的 Bencode 读写支持

    `QBencode` 库为 Qt 开发者提供了一套方便的接口,用于将这些 Bencode 数据结构转换为 C++ 对象,以及将 C++ 对象编码为 Bencode 格式。以下是一些基本的使用步骤: 1. **安装库**:首先,你需要将 `QBencode-...

    Bencode:解析torrent文件

    这个示例中,`bdecode`函数递归地处理Bencode编码的字符串,返回原始的Python对象。首先检查字符串是否以'i'、'l'或'd'开头,然后根据Bencode规则进行解析。最后,通过读取torrent文件并将其内容传递给`bdecode`函数...

    bencoder:Bencoder 负责“b-encode”数据格式的序列化和反序列化

    Bencode(发音为 B encode)是点对点文件共享系统 BitTorrent 用于存储和传输松散结构化数据的编码。 该库支持四种不同类型的值: 字节字符串作为String类; 整数作为Integer类; 字典(关联数组) List&lt;Entry&gt;...

    Bencoder:Python 编码器和解码器

    1. `bencoder.py`:库的核心实现,包含了`bencode`和`bdecode`等函数的代码。 2. `tests/`:测试目录,包含单元测试用例,用于验证库的功能是否正常工作。 3. `README.md`:项目说明文件,详细介绍了库的安装、使用...

    bencoding:Bittorent协议使用的Bencoded数据的序列化和反序列化

    对于许多本机数据类型,此程序包实现了与Bencode格式之间的快速无缝编码/解码。 为了获得我们使用和手动优化的解析器,因此该库被视为BEncode和AttoBencode包的替代品。 格式 Bencode与JSON非常相似:它具有字典...

    BT种子解析器(C++源代码).rar

    总结来说,"BT种子解析器(C++源代码)"涉及到的关键技术包括文件I/O操作、二进制数据解析、bencode编码解码、网络通信以及P2P网络原理。通过学习和实现这样的项目,开发者能够深入理解BT协议,提升在网络编程和文件...

    libtorrent库torrent_info接口[收集].pdf

    3. torrent_info(entry const& torrent_file):通过一个 bencode 编码的条目对象构造 torrent_info 对象,这个对象包含了.torrent 文件的内容。 接下来,是一系列对.torrent文件进行操作的接口: - create_torrent...

    cpp-计算机学科基础知识和主流编程语言相关内容的总结

    同时,还需要掌握文件I/O操作和数据编码解码,如Bencode格式,这是BitTorrent协议中的数据表示方式。 在"CS_Offer-master"这个项目中,很可能是对《剑指Offer》这本书的C++实现。这是一本关于面试准备的书籍,其中...

    tortilla:C++ BitTorrent 库和客户端

    3. **Bencode编码**:BitTorrent使用Bencode编码来表示元数据,如.torrent文件。 4. **块管理**:客户端管理下载和上传的文件块,确保正确顺序和完整性。 5. **连接管理**:建立和维护与其他柠檬和种子的TCP连接,...

    LinuxBitTorrent

    4. **BitTorrent协议理解**:理解BitTorrent协议的原理至关重要,包括Tracker服务器的作用、Bencode编码格式、Piece和Hash校验等概念。 5. **文件操作**:C++的`&lt;fstream&gt;`库用于处理本地文件的读写,...

Global site tag (gtag.js) - Google Analytics