blob blobmsg blobmsg_json使用

Blob :二进制大对象

Blobmsg :二进制对象网络序列化。

blobmsg_json   用于json对象的序列化

参考链接:https://www.cnblogs.com/embedded-linux/p/6792359.html

一 : blob 的使用  (熟悉使用blob的各种api)

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <unistd.h>
#include <time.h>
#include <getopt.h>
#include <sys/signal.h>
#include "libubox/uloop.h"
#include "libubox/ustream.h"
#include "libubox/utils.h"
#include "libubus.h"
#include "json-c/json.h"
#include "libubox/blob.h"
#include "libubox/blobmsg.h"
#include "libubox/blobmsg_json.h"
#include "libubox/ulog.h"
#include "libubox/runqueue.h"
#include <libubox/list.h>
#include <libubox/uloop.h>
#include <libubox/ustream.h>
#include "termios.h"
  int main()
{

static struct blob_buf b;
struct blob_attr *attr1,*attr2;
char * str,*str1;
void *ptr;
struct blob_attr * pos;
int rem=0;
blob_buf_init(&b, 0);

//设置blob数据
attr1=blob_put_string(&b, 1, "hello");

attr2=blob_put_u8(&b, 2, 100);

//获取blob数据
str=blob_get_string(attr1);
int a1=blob_get_u8(attr2);

//打印数据

printf("str=%s\n",str);    
printf("a1=%d\n",a1);

//输出有效数据地址  和 id
ptr=blob_data(attr1);   // blob_data
printf("ptr=%p\n",ptr);   
printf("id =%d",blob_id(attr1));  //blob_id

printf(" 有效存储空间大小  blob_len =%d\n",blob_len(attr1));       // blob_len 
printf("完全存储空间大小  blob_raw_len =%d\n",blob_raw_len(attr1));   // blob_raw_len
printf("blob属性填补后空间存储大小  blob_pad_len =%d\n",blob_raw_len(attr1)); //blob_raw_len


rem=12;
__blob_for_each_attr(pos,attr1,rem)  //遍历
{
  str1=blob_get_string(pos);
  printf("str1 =%s\n",str1);
}
return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当ubus数据具有多层嵌套的BLOBMSG_TYPE_TABLE或BLOBMSG_TYPE_ARRAY类型时,可以使用递归的方式进行解析。下面是一个示例代码,演示了如何解析多层嵌套的ubus数据: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <libubox/blobmsg_json.h> void parse_blobmsg_table(const struct blob_attr *attr); void parse_blobmsg_array(const struct blob_attr *attr) { int rem; struct blob_attr *tb[BLOBMSG_TYPE_MAX + 1]; struct blob_attr *cur; blobmsg_for_each_attr(cur, attr, rem) { if (blobmsg_type(cur) == BLOBMSG_TYPE_TABLE) { parse_blobmsg_table(cur); } else if (blobmsg_type(cur) == BLOBMSG_TYPE_ARRAY) { parse_blobmsg_array(cur); } else { fprintf(stderr, "Unexpected blobmsg type\n"); } } } void parse_blobmsg_table(const struct blob_attr *attr) { int rem; struct blob_attr *tb[BLOBMSG_TYPE_MAX + 1]; struct blob_attr *cur; blobmsg_parse(tb, BLOBMSG_TYPE_MAX, blobmsg_data(attr), blobmsg_data_len(attr)); if (!tb[0]) { fprintf(stderr, "Failed to parse blobmsg table\n"); return; } blobmsg_for_each_attr(cur, tb[0], rem) { if (blobmsg_type(cur) == BLOBMSG_TYPE_TABLE) { parse_blobmsg_table(cur); } else if (blobmsg_type(cur) == BLOBMSG_TYPE_ARRAY) { parse_blobmsg_array(cur); } else { // Handle individual values // You can access the value using blobmsg_get_type() and blobmsg_get_* functions const char *key = blobmsg_name(cur); int val = blobmsg_get_u32(cur); printf("Key: %s, Value: %d\n", key, val); } } } int main() { // Example ubus data in JSON format const char *json_data = "{\"table\":{\"nested_table\":{\"array\":[1,2,3]},\"value\":123}}"; struct blob_attr *attr; struct blob_buf buf; blob_buf_init(&buf, 0); if (blobmsg_add_json_from_string(&buf, json_data) != 0) { fprintf(stderr, "Failed to parse JSON data\n"); return 1; } attr = buf.head; if (!attr) { fprintf(stderr, "Empty blobmsg data\n"); return 1; } parse_blobmsg_table(attr); return 0; } ``` 在这个示例代码中,我们使用了libubox库中的函数来解析ubus数据。首先,我们将JSON格式的ubus数据转换为blobmsg格式,然后使用parse_blobmsg_table函数进行解析。在解析过程中,如果遇到嵌套的BLOBMSG_TYPE_TABLE类型或BLOBMSG_TYPE_ARRAY类型,就会递归调用相应的解析函数。 在parse_blobmsg_table函数中,我们使用blobmsg_type和blobmsg_for_each_attr函数来遍历解析后的数据。对于嵌套的BLOBMSG_TYPE_TABLE和BLOBMSG_TYPE_ARRAY类型,我们会分别调用parse_blobmsg_table和parse_blobmsg_array函数进行解析。对于其他类型,我们可以使用blobmsg_get_*函数来获取具体的值。 请注意,这只是一个简单的示例代码,实际的解析过程可能更加复杂,需要根据具体的ubus数据结构和需求进行适当的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值