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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:18:01