Small Erlang bencode library

Christian S <>
Wed May 17 09:58:47 CEST 2006


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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20060517/aa3b78ba/attachment.html>


More information about the erlang-questions mailing list