You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

zenoh-c 1.4.0如何从z_loaned_sample_t提取原始字节及长度?

在zenoh-c 1.4.0中提取z_loaned_sample_t的原始字节数据及长度

要从z_loaned_sample_t中获取原始字节用于cereal反序列化,需要通过zenoh-c提供的API访问opaque类型的payload,具体操作如下:

核心步骤

  1. 提取payload字节对象:用z_sample_payload()函数从z_loaned_sample_t中取出z_owned_bytes_t类型的payload。
  2. 获取字节视图:通过z_bytes_as_view()将z_owned_bytes_t转换为z_bytes_view_t结构体,该结构体直接提供原始字节指针和长度。
  3. 内存管理:z_owned_bytes_t属于需手动管理的资源,使用后必须调用z_drop()释放;z_loaned_sample_t由zenoh自动管理,无需手动释放。

完整代码示例

#include <zenoh.h>
#include <cereal/archives/binary.hpp>
#include <sstream>

// 自定义复杂类型示例
struct YourCustomType {
    // 类型成员定义
    int id;
    std::string name;

    template<class Archive>
    void serialize(Archive& archive) {
        archive(id, name);
    }
};

void on_sample_received(const z_loaned_sample_t* sample, void* arg) {
    // 提取payload的z_owned_bytes_t
    z_owned_bytes_t payload = z_sample_payload(sample);

    // 转换为字节视图,获取原始指针和长度
    z_bytes_view_t view = z_bytes_as_view(&payload);
    const uint8_t* raw_data = view.start;
    size_t data_len = view.len;

    // 用cereal执行反序列化
    std::stringstream ss(std::string(reinterpret_cast<const char*>(raw_data), data_len));
    cereal::BinaryInputArchive archive(ss);
    YourCustomType obj;
    archive(obj);

    // 释放z_owned_bytes_t资源
    z_drop(z_move(payload));
}

// 订阅初始化示例
int main() {
    z_owned_config_t config = z_config_default();
    z_owned_session_t session = z_open(z_move(config));
    if (!z_check(session)) {
        return -1;
    }

    const char* key_expr = "your/data/topic";
    z_owned_subscriber_t sub = z_declare_subscriber(
        z_loan(session),
        z_keyexpr(key_expr),
        z_subscriber_callback(on_sample_received, NULL),
        NULL
    );
    if (!z_check(sub)) {
        z_drop(z_move(session));
        return -1;
    }

    // 保持会话运行
    z_sleep(z_duration_sec(60));

    // 清理资源
    z_drop(z_move(sub));
    z_drop(z_move(session));
    return 0;
}

关键说明

  • z_bytes_view_t的start是const uint8_t*类型,若需可修改的缓冲区,需将数据拷贝到自行分配的内存中。
  • 不要直接修改z_bytes_view_t指向的内存,这是zenoh管理的loaned内存,修改会导致未定义行为。
  • cereal二进制反序列化依赖输入流,这里通过原始字节构造std::stringstream是最直接的适配方式。

内容的提问来源于stack exchange,提问作者Hadarelv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:05:57