【问题标题】:Binary Serialization Using Boost and uint8_t使用 Boost 和 uint8_t 进行二进制序列化
【发布时间】:2014-07-25 05:21:37
【问题描述】:

在处理二进制数据时,我倾向于使用uint8_t。我想这对我来说似乎是一个字节的类型。但是,我无法弄清楚如何让二进制序列化在 boost 中使用该类型。我是在问不可能的事情还是只是错过了一些简单的事情?

此示例程序无法在 VS2013 上编译,并抱怨无法将流转换为 std::ostreamstd::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;
}

【问题讨论】:

    标签: c++ boost binary-serialization binary-deserialization


    【解决方案1】:

    二进制存档采用std::istream / std::ostream 参数,因此您无法使用std::basic_istream&lt;char&gt; / std::basic_ostream&lt;char&gt;

    顺便说一句,不能保证实现提供unsigned char / uint8_t 版本的流(或者更确切地说是std::char_traits&lt;unsigned char&gt;)。

    【讨论】:

    • 这在两个段落中都很准确。因此,确实,只需使用普通流。正确编码信息是存档的工作。
    猜你喜欢
    • 1970-01-01
    • 2011-03-02
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多