1 Introduction
3 History
4 Legal
Version: 2:0

bencode: BitTorrent Bencode Decoding in Racket

Neil Van Dyke

 (require (planet neil/bencode:2:0))

1 Introduction

The bencode package is for parsing the bencoding format of the BitTorrent network protocol into basic Racket data types. This is useful for inspecting .torrent files, and might be useful in the implementation of a BitTorrent client or protocol analyzer.
The format interpretation is based on the undated BitTorrent protocol documentation Web page as viewed on 2005-04-17. The mapping from those bencoding types to Scheme types is:


Racket byte string.


Scheme integer.


Scheme list.


Scheme list with the symbol dictionary as its head, and an association list as its tail.

For example, a parse of a certain real-world .torrent file:

> (unbencode (open-input-file "debian.torrent"))

    (#"announce"      . #"http://cdimage.debian.org:6969/announce")
    (#"comment"       . #"Debian CD from cdimage.debian.org")
    (#"creation date" . 1105009474)
     (#"length"       . 600158208)
     (#"name"         . #"debian-30r4-i386-binary-1.iso")
     (#"piece length" . 524288)
     (#"pieces"       . [...large byte string...]))))


(unbencode-single port)  list?
  port : input-port?
Parses a single bencoding object (and any child objects, in the case of a list or dictionary) from input port port and yields the Scheme representation.
(unbencode port)  list?
  port : input-port?
Yields a list of the Scheme representations of all bencoding objects parsed from input port port.

3 History

4 Legal

Copyright (c) 2005, 2009, 2012 Neil Van Dyke. This program is Free Software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. See http://www.gnu.org/licenses/ for details. For other licenses and consulting, please contact the author.