C语言使用c-capnproto时如何正确处理capn_data blob并封装HMAC?
c-capnproto Data类型字段正确填充方案
问题根因
你自行实现的buf_to_data函数手动构造capn_data结构的方式不符合c-capnproto的设计规则:
- c-capnproto要求所有序列化用到的动态数据(包括
Data类型的二进制blob)必须分配在当前序列化上下文的段(segment)内存空间内,你直接传入外部栈/堆buffer、将seg字段设为NULL会导致序列化时无法识别该数据块,直接被跳过 - 你手动将
type字段设为CAPN_NULL,会被序列化器识别为空对象,完全不会写入输出流
正确实现
1. 替换辅助函数
c-capnproto提供了官方接口capn_new_data用来创建Data类型对象,会自动在指定段上分配对应长度的内存,无需手动填充内部字段:
static capn_data buf_to_data(struct capn_segment* seg, const uint8_t* buf, int len) { // 在指定段上分配长度为len的Data对象 capn_data data = capn_new_data(seg, len); // 将外部buffer的数据拷贝到c-capnproto管理的内存空间 memcpy(data.p.data, buf, len); return data; }
2. 修改调用逻辑
调用buf_to_data时传入当前序列化上下文的段指针cs即可:
// 原来的调用代码替换为 AuthenticatedHeartbeat_set_heartbeat(ahb, buf_to_data(cs, beat, packed_size)); AuthenticatedHeartbeat_set_hmac(ahb, buf_to_data(cs, hmac, 32));
验证
修改后重新编译运行,输出的AUTH部分会包含完整的序列化Heartbeat数据和HMAC值,长度符合预期。
内容的提问来源于stack exchange,提问作者celkas
相关产品推荐
相关产品推荐

