@hackage benc0.1.0.0
Bencode encoding and decoding library
Installation
Dependencies (7)
- 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 Show all…
Dependents (0)
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")
- Bugs (e.g. crashes on input
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.