【问题标题】:Create binary data iostream创建二进制数据 iostream
【发布时间】:2018-01-21 09:56:28
【问题描述】:

我是 C++ 新手,我正在学习使用 boost::asio 进行网络编程来处理传入的二进制数据。我来自嵌入式 C,我会使用固定缓冲区读取为从网络套接字接收的位和字节编写打包程序和解包程序。

我想了解 iostream。要从 boost::asio 中的网络套接字读取二进制数据,我使用的是 streambuf。

是否可以开发一个 iostream 来从流中读取数据类型并使用它们?

从 std::basic_streambuf 子类化的正确方法是什么?然后使用我的数据类型使用流中的数据。我不需要定义固定大小的缓冲区来执行读取。

我不知道该怎么做。可以指出一个合适的例子来说明我需要做什么。

我这样做主要是为了提高我的 C++ 技能?

谢谢

电车

【问题讨论】:

    标签: c++ boost-asio iostream


    【解决方案1】:

    不要继承asio::streambuf

    相反,使用流式传输类型或例如Boost 序列化档案(boost::archive::text_oarchiveboost::archive::text_iarchive)或类似的东西。这是相当高级的,允许您序列化完整的对象图,包括多态类型和(循环)关系。

    遗憾的是,Boost Serialization 不提供简单的成帧协议,因此您的协议应该期望每条消息都有新的连接,或者在其之上添加一个成帧协议。

    有很多样本。也许从这里开始:

    PS。注意其他选项

    • 直接使用boost::asio::buffer 实现更简单的 POD 方法
    • 谷物、Cap'n-Proto、protobuf 等

    【讨论】:

    • Sehe - 哇,谢谢你的回答。我将阅读示例并尝试消化。对于我的具体情况,我正在从我不拥有的设备中读取数据。它有一个二进制协议。 。可变长度数据根据功能代码 (FC) 进行不同的解码。这些方法中的哪一种最适合进行调查。
    • 嗯。为什么这些信息不在问题中?很多关于“子类化”(?!)streambuf 的毫无根据的东西,但没有关于您... 知道的简单要求的内容?我建议您编辑问题,然后以最简单的方式实现它 - 使用任何缓冲区(streambuf 或 uint8_t 的(固定)向量)。流在这里真的不相关,您可以在数组顶部使用流(例如boost::iostreams::array_source)就好了。
    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2011-01-07
    • 2022-01-13
    • 2014-06-12
    相关资源
    最近更新 更多