blob blobmsg 2

如何理解blbo 和blobmsg:
 blob是一个通用的二进制数据结构,blobmsg是blob的一种特定类型,它用于处理和解析JSON数据。

为什么创建blobmsg 先要创建blob
创建blobmsg之前需要创建blob的原因是,blobmsg是在blob的基础上进行扩展和封装的。

 blobmsg根节点是一个纯粹的blob,所以blobmsg解析时需要注意:
(1)第一层解析,data必须取值为blob_data(root_blob),len必须取值为blob_len(root_blob)
(2)第二层及以上解析,data必须取值为blobmsg_data(sub_blob),len必须取值为blobmsg_data_len(sub_blob)
所以,应避免混合使用blob和blobmsg语义,比如第一层使用blob语义,第二层使用blobmsg语义
 

举例:

struct blob_buf {
    struct blob_attr *head;   // 指向blob_buf的开头,分配一个4字节的blob_attr(仅有id_len),记录已使用的len。最初时等于blob_buf->buf
    bool (*grow)(struct blob_buf *buf, int minlen);   //内存扩展回调函数
    int buflen;   //buf总长度
    void *buf;    // 指向buf起始位置(开头)
};

blob_buf 管理的是多个blob对象,blob对象由blob_attr 结构体描述。通过blobmsg API可以方便的

构建和解析json包数据。

int main()
{
    static struct blob_buf buf;  //  管理多个 blob
    blobmsg_buf_init(&buf);
    fill_message(&buf);
}

static void fill_message(struct blob_buf *buf)
{
    void *tbl;
    blobmsg_add_string(buf, "message", "Hello, world!");  // 根据理解buf 对应的就是根节点
    tbl = blobmsg_open_table(buf, "testdata");
    blobmsg_add_u32(buf, "hello", 1);
    blobmsg_add_string(buf, "world", "2");
    blobmsg_close_table(buf, tbl);
    tbl = blobmsg_open_array(buf, "list");
    blobmsg_add_u32(buf, NULL, 0);
    blobmsg_add_u32(buf, NULL, 1);
    blobmsg_add_u32(buf, NULL, 2);
    blobmsg_close_table(buf, tbl);
}

通过对blob 的理解, 可以直接写出fill_message 构建的json 如下:

{
  "message":"hello,world",
  "testdata":
  {
     "hello":1,
    "world":2   
  },
  "list":[0,1,2]
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值