Small Erlang bencode library

Steve Smith <>
Thu May 18 02:00:29 CEST 2006


On Wed, 2006-05-17 at 09:58 +0200, Christian S wrote:
> This is how i would build the encoder. Mainly so that I dont have to
> include the type tagging
> pairs when the erlang terms already have types of their own.
> 
> bencode(List) when is_list(List) ->
>         [$l, [bencode(Item) || Item <- List], $e]; 
> bencode(Int) when is_integer(Int) ->
>         [$i, integer_to_list(Int), $e];
> bencode(Bin) when is_binary(Bin) ->
>         [integer_to_list(size(Bin)), $:, Bin];
> bencode(Dict) when element(1, Dict) == dict -> 
>         Sorter = fun({Key1, _}, {Key2, _}) -> Key1 < Key2 end,
>         Pairs = [[bencode(Key), bencode(Value)] || {Key, Value} <-
> lists:sort(Sorter, dict:to_list(Dict))],
>         [$d, Pairs, $e].

> 
> Dict = dict:store(<<"foo">>, 3, dict:new()).
> Terms = [1,2, <<"How's this?">>, Dict].
> 
> Encoded = bencode:bencode(Terms).
> 
> If you want this as a string you can do
> "binary_to_list(list_to_binary(Encoded))." and get 
> "li1ei2e11:How's this?d3:fooi3eee"
> 
> But the value of Encoded itself is useable, it is known as the type
> iolist(), sometimes 
> even string() in documentation. 
> You can send iolist() over sockets so pre-flattening them is not
> necessary. 
> 
> It appears that dict keys must be strings, the encoder should probably
> crash if a key
> is not. In all my whole dict encoding part suffer some code smell.
> Maybe someone
> else has a better alternative?
> 
> On 5/17/06, Steve Smith <> wrote:
>         Hi,
>         
>         As a preliminary exercise in learning Erlang I've implemented
>         a basic
>         bencoding library (bencoding being the serialisation system
>         used in the
>         bittorrent protocol).  The darcs repository is available
>         here: 
>         
>             http://people.vislab.usyd.edu.au/~ssmith/erlang/bencode
>         
>         As this is my first go at declarative programming comments and
>         corrections are welcome. 
>         
>         Cheers,
>         Steve
>         
> 




More information about the erlang-questions mailing list