Encoding and decoding
Decoding
Decoding bencoded data can be done with decode_value() and decode_view().
decode() will return a bvalue instance and decode_view()
will return a descriptor table from which a bview to the root element can be obtained.
const std::string data = "d3:cow3:moo4:spam4:eggse";
bc::bvalue decoded= bc::decode_value(data);
// pass custom policy template argument for the basic_bvalue
bc::basic_bvalue<MyPolicy> decoded2 = bc::decode_value<MyPolicy>(data);
bc::descriptor_table desc_table = bc::decode_view(data);
bc::bview root_view = desc_table.get_root();
Encoding
// encode a bvalue
auto bv = bc::bvalue(bc::type::dict, {{"cow", "moo"}, {"spam", "eggs"}});
auto bv_enc = bc::encode(bv);
// true
(bv_enc == "d3:cow3:moo4:spam4:eggse")
// encode an event_producer
auto s = bencode::encode("string");
// true
(s == "6:string");
// encode to a std::stringstream
std::ostringstream ss {}
bc::encode_to(ss, 20);
auto stream_str = ss.str()
// true
(stream_str == "i20e")
// encode to an output_iterator
std::string out {}
out.reserve(100);
bencode::encode_to(out, 20);
// true
(out == "i20e")
Encoder
Encoding bvalue instances or object satisfying event_producer
can be encoded with encode() which will return a std::string
or encode_to() which accept a cpp:class:std::ostream
or output_iterator as its first argument.
decode() will return a bvalue instance and decode_view()
will return a descriptor table from which a bview to the root element can be obtained.
encoder provides an output stream interface that serializes objects to bencode
and writes the encoded form to the wrapped storage which can be passed as an
OutputIterator or as a std::ostream.
This allows to create complex bencoded objects without the need to create an intermediary
bvalue. Bencode container types can be created with the use of the following tags:
list_begin
list_end
dict_begin
dict_end
Example:
std::ostringstream os {};
auto eos = bencode::encoder(os);
eos << bencode::dict_begin
<< "key1" << 1
<< "key2" << "two"
<< "key3"
<< bencode::list_begin
<< 1
<< 2
<< 3
<< bencode::list_end
<< bencode::dict_end;
eos.str() // "d4:key1i1e4:key23:two4:key3li1ei2ei3eee"
Any object that satisfies the event_producer concept can be serialized using encoding_ostream.