При работе с двоичными данными я склонен использовать uint8_t
, Я думаю, это просто похоже на тип байта для меня. Однако я не могу понять, как заставить двоичную сериализацию в boost работать с этим типом. Я спрашиваю о невозможном или просто упускаю что-то простое?
Этот пример программы не компилируется на VS2013 с некоторой жалобой на то, что он не собирается конвертировать потоки в std::ostream
или же std::istream
,
Программа отлично работает с char
вместо uint8_t
, но это беспокоит меня. 🙂
#include <cstdlib> // EXIT_SUCCESS
#include <vector>
#include "boost/archive/binary_iarchive.hpp"#include "boost/archive/binary_oarchive.hpp"#include "boost/iostreams/device/array.hpp"#include "boost/iostreams/device/back_inserter.hpp"#include "boost/iostreams/stream_buffer.hpp"
int main(int argc, char** argv)
{
typedef std::vector< uint8_t > Buffer;
Buffer buffer;
// Serialization
{
int foo = 1;
typedef boost::iostreams::back_insert_device< Buffer > Device;
Device device(buffer);
typedef boost::iostreams::stream_buffer< Device > Stream;
Stream stream(device);
{
boost::archive::binary_oarchive archive(stream);
archive << foo;
}
}
// Deserialization
{
int foo;
typedef boost::iostreams::basic_array_source< uint8_t > Device;
Device device(buffer.data(), buffer.size());
typedef boost::iostreams::stream_buffer< Device > Stream;
Stream stream(device);
{
boost::archive::binary_iarchive archive(stream);
archive >> foo;
}
}
return EXIT_SUCCESS;
}
Бинарные архивы занимают std::istream
/ std::ostream
аргумент, так что вы застряли с помощью std::basic_istream<char>
/ std::basic_ostream<char>
,
Между прочим, нет гарантии, что реализации предлагают unsigned char
/ uint8_t
версии потоков (точнее std::char_traits<unsigned char>
).