https://github.com/bluk/bt_bencode
Helps with Bencode encoding/decoding.
https://github.com/bluk/bt_bencode
bencode bencode-parser bencoder bittorrent rust serde serde-support
Last synced: about 1 month ago
JSON representation
Helps with Bencode encoding/decoding.
- Host: GitHub
- URL: https://github.com/bluk/bt_bencode
- Owner: bluk
- License: apache-2.0
- Created: 2020-02-02T04:37:44.000Z (over 5 years ago)
- Default Branch: trunk
- Last Pushed: 2025-03-16T19:40:00.000Z (2 months ago)
- Last Synced: 2025-04-12T08:52:56.683Z (about 1 month ago)
- Topics: bencode, bencode-parser, bencoder, bittorrent, rust, serde, serde-support
- Language: Rust
- Homepage: https://docs.rs/bt_bencode/
- Size: 321 KB
- Stars: 18
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE-APACHE
Awesome Lists containing this project
README
# BtBencode
BtBencode is a library which can help with [Bencode][wikipedia_bencode]
encoding/decoding. Bencode is primarily used in [BitTorrent][bep_0003] related
applications.It uses the [Serde][serde] library to serialize and deserialize Bencode data.
It is similar to [Serde JSON][serde_json] in terms of functionality and
implementation.* [Latest API Documentation][docs_rs_bt_bencode]
## Examples
An example serializing a standard Rust collection type and then deserializing
into a custom type:```rust
use std::collections::BTreeMap;
use serde_derive::Deserialize;let mut dict: BTreeMap = BTreeMap::new();
dict.insert(String::from("url"), String::from("https://example.com/"));let serialized_bytes = bt_bencode::to_vec(&dict)?;
#[derive(Deserialize)]
struct Info<'a> {
url: &'a str,
}let info: Info = bt_bencode::from_slice(&serialized_bytes)?;
assert_eq!(info.url, "https://example.com/");
```An example deserializing from a slice of bytes into a general `Value`
representation and then from the `Value` instance into a more strongly typed
data structure.```rust
use serde_derive::{Serialize, Deserialize};use bt_bencode::Value;
#[derive(Serialize, Deserialize)]
struct Info {
t: String,
url: String,
}let serialized_bytes = bt_bencode::to_vec(&Info {
t: String::from("query"),
url: String::from("https://example.com/"),
})?;let value: Value = bt_bencode::from_slice(&serialized_bytes)?;
assert_eq!(value["t"].as_str().unwrap(), "query");
assert_eq!(
value.get("url").and_then(|url| url.as_str()).unwrap(),
"https://example.com/"
);let info: Info = bt_bencode::from_value(value)?;
assert_eq!(info.t, "query");
assert_eq!(info.url, "https://example.com/");
```## Installation
```sh
cargo add bt_bencode
```By default, the `std` feature is enabled.
### Alloc only
If the host environment has an allocator but does not have access to the Rust
`std` library:```sh
cargo add --no-default-features --features alloc bt_bencode
```## License
Licensed under either of [Apache License, Version 2.0][LICENSE_APACHE] or [MIT
License][LICENSE_MIT] at your option.### Contributions
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.[LICENSE_APACHE]: LICENSE-APACHE
[LICENSE_MIT]: LICENSE-MIT
[wikipedia_bencode]: https://en.wikipedia.org/wiki/Bencode
[bep_0003]: http://www.bittorrent.org/beps/bep_0003.html
[serde]: https://serde.rs
[serde_json]: https://github.com/serde-rs/json
[docs_rs_bt_bencode]: https://docs.rs/bt_bencode/latest/bt_bencode/