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,具体操作如下:
核心步骤
- 提取payload字节对象:用
z_sample_payload()函数从z_loaned_sample_t中取出z_owned_bytes_t类型的payload。 - 获取字节视图:通过
z_bytes_as_view()将z_owned_bytes_t转换为z_bytes_view_t结构体,该结构体直接提供原始字节指针和长度。 - 内存管理:
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
相关产品推荐
相关产品推荐

