如何使用libcbor直接生成含嵌套结构的CBOR对象?
直接用libcbor生成嵌套CBOR结构的解决方案
要生成对应{"var1":"val1","var2":{"var1a":"val1a"}}的CBOR嵌套结构,核心是先创建子Map,再将其作为值添加到根Map中。以下是具体实现步骤和代码示例:
核心步骤
- 创建根Map(明确大小为2,对应顶层两个键值对)
- 创建子Map(明确大小为1,对应
var2的内部键值对) - 给子Map添加
var1a->val1a的键值对 - 给根Map添加
var1->val1和var2->子Map的键值对 - 将根Map序列化为CBOR缓冲区
- 释放所有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
相关产品推荐
相关产品推荐

