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

如何使用libcbor直接生成含嵌套结构的CBOR对象?

直接用libcbor生成嵌套CBOR结构的解决方案

要生成对应{"var1":"val1","var2":{"var1a":"val1a"}}的CBOR嵌套结构,核心是先创建子Map,再将其作为值添加到根Map中。以下是具体实现步骤和代码示例:

核心步骤

  1. 创建根Map(明确大小为2,对应顶层两个键值对)
  2. 创建子Map(明确大小为1,对应var2的内部键值对)
  3. 给子Map添加var1a->val1a的键值对
  4. 给根Map添加var1->val1和var2->子Map的键值对
  5. 将根Map序列化为CBOR缓冲区
  6. 释放所有CBOR对象资源(避免内存泄漏)

完整代码示例

#include <stdio.h>
#include <stdlib.h>
#include <cbor.h>

int main() {
    // 1. 创建根Map(确定大小为2)
    cbor_item_t *root_map = cbor_new_definite_map(2);
    if (root_map == NULL) {
        fprintf(stderr, "Failed to create root map\n");
        return 1;
    }

    // 2. 创建子Map(确定大小为1)
    cbor_item_t *sub_map = cbor_new_definite_map(1);
    if (sub_map == NULL) {
        fprintf(stderr, "Failed to create sub map\n");
        cbor_decref(root_map);
        return 1;
    }

    // 3. 给子Map添加键值对:"var1a" -> "val1a"
    cbor_item_t *sub_key = cbor_build_string("var1a");
    cbor_item_t *sub_val = cbor_build_string("val1a");
    cbor_map_add(sub_map, sub_key, sub_val);
    // 添加后无需手动释放sub_key和sub_val,map会接管引用计数

    // 4. 给根Map添加键值对
    // 第一个键值对:"var1" -> "val1"
    cbor_item_t *root_key1 = cbor_build_string("var1");
    cbor_item_t *root_val1 = cbor_build_string("val1");
    cbor_map_add(root_map, root_key1, root_val1);

    // 第二个键值对:"var2" -> 子Map
    cbor_item_t *root_key2 = cbor_build_string("var2");
    cbor_map_add(root_map, root_key2, sub_map);
    // root_key系列和sub_map的引用由root_map接管

    // 5. 序列化为CBOR缓冲区
    size_t buffer_size = cbor_serialize_alloc(root_map, NULL, 0);
    uint8_t *cbor_buffer = malloc(buffer_size);
    if (cbor_buffer == NULL) {
        fprintf(stderr, "Failed to allocate buffer\n");
        cbor_decref(root_map);
        return 1;
    }
    cbor_serialize(root_map, cbor_buffer, buffer_size);

    // 可选:打印CBOR十六进制内容验证
    printf("CBOR hex: ");
    for (size_t i = 0; i < buffer_size; i++) {
        printf("%02x ", cbor_buffer[i]);
    }
    printf("\n");

    // 6. 释放资源
    free(cbor_buffer);
    cbor_decref(root_map); // 释放根Map会自动递归释放子Map及所有内部对象

    return 0;
}

关键注意事项

  • 使用cbor_new_definite_map时传入明确的键值对数量,比不定长Map更高效
  • cbor_map_add会自动管理传入的键和值的引用计数,无需手动调用cbor_decref(除非你提前保留了额外引用)
  • 最终只需释放根Map,libcbor会递归释放所有嵌套的子对象,避免内存泄漏
  • 编译时需要链接libcbor库,例如:gcc your_code.c -o cbor_nested -lcbor

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:45:59