benc: Bencode encoding and decoding library

[ codec, library, mit ] [ Propose Tags ]

Bencode encoding and decoding library.


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.1.0.0, 0.1.1.0
Change log CHANGELOG.md
Dependencies base (>=4.14 && <5.0), bytestring (>=0.10.12 && <0.13), containers (>=0.6.5 && <0.8), primitive (>=0.9.0 && <0.10), text (>=1.2.4 && <2.2), transformers (>=0.5.6 && <0.7), vector (>=0.13.1 && <0.14) [details]
License MIT
Author Soumik Sarkar
Maintainer soumiksarkar.3120@gmail.com
Category Codec
Home page https://github.com/meooow25/benc
Bug tracker https://github.com/meooow25/benc/issues
Uploaded by meooow at 2023-11-09T13:16:06Z
Distributions
Downloads 38 total (7 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2023-11-09 [all 1 reports]

Readme for benc-0.1.0.0

[back to package description]

benc

Bencode encoding and decoding library

Bencode

Bencode is a simple encoding format for loosely structured data, comparable to JSON. It is used primarily in the BitTorrent protocol. For a description of the format see

Features

This library offers

  • A nice API
  • Correctness
  • Speed

This library does not attempt to support

  • Lazy or incremental parsing
  • Failing with detailed error messages

Getting started

Please see the Haddocks for Data.Bencode.Decode and Data.Bencode.Encode.

Alternatives

There are currently three other Bencode libraries on Hackage:

All of these are in some combination of buggy, slow, and unmaintained.

Click for details
  • bencode:
    • Bugs (e.g. crashes on input "i-e")
    • Very slow parsing
    • No high-level encoding API
    • [Minor] Lax parsing (e.g. admits the invalid "i-0e")
  • AttoBencode
    • Slow parsing
    • [Minor] Lax parsing (e.g. admits the invalid "i-0e")
  • bencoding
    • Bugs (e.g. crashes on parsing non-UTF-8 into Text)
    • Questionable design of dict encoding/decoding API, where human error can lead to mis-parsing Bencode or writing invalid Bencode.
    • [Minor] Lax parsing (e.g. admits the invalid "i-0e")

API comparison

See the benchmark file as a comparison point of the library APIs.

Benchmarks

Below is a comparison of decoding and encoding of two torrent files, performed with GHC 9.6.3. See the benchmark file for details.

Decoding

Library crossref ubuntu
benc 27.6 ms ± 2.1 ms 1.46 μs ± 93 ns
bencode 218 ms ± 11 ms 28.4 μs ± 1.5 μs
AttoBencode 44.8 ms ± 3.8 ms 2.97 μs ± 171 ns
bencoding 39.7 ms ± 3.7 ms 2.38 μs ± 181 ns

Note: bencode parses from a lazy ByteString unlike the rest which parse from strict ByteStrings, and so is expected to be a little slower.

Encoding

Library crossref ubuntu
benc 11.8 ms ± 1.0 ms 1.91 μs ± 179 ns
bencode 42.4 ms ± 3.1 ms 3.19 μs ± 173 ns
AttoBencode 20.2 ms ± 1.1 ms 10.2 μs ± 387 ns
bencoding 11.6 ms ± 1.1 ms 1.79 μs ± 100 ns

Note: AttoBencode encodes to a strict ByteString via a lazy ByteString, unlike the rest, which only prepare the lazy ByteString. As such, it is expected to be slower.

Contributing

Contributions, bug reports, suggestions welcome! Please open an issue.