首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析cbor流

解析cbor流
EN

Stack Overflow用户
提问于 2020-03-17 04:19:33
回答 1查看 752关注 0票数 2

我正在尝试使用tinyCBOR解析CBOR流。目标是为“映射类型”编写一个通用解析代码(因为我不知道在cbor流中有多少个键以及它们是哪些),但不是对于一个json,我只想使用“”获取值,但是要从键中获取值,我必须知道键。Im只需在函数中传递"key“即可解析该值

代码语言:javascript
复制
cbor_value_map_find_value(&main_value,"Age",&map_value);

但对我来说仍有一些不清楚的事情。

为了从CBOR流中获取键和值,应该遵循什么顺序?

就像。以下是我的地图格式数据-

代码语言:javascript
复制
{"Roll_number": 7, "Age": 24, "Name": "USER"}

这是cbor.me链接的二进制格式-

代码语言:javascript
复制
   A3                        # map(3)
   6B                        # text(11)
   526F6C6C5F6E756D626572    # "Roll_number"
   07                        # unsigned(7)
   63                        # text(3)
   416765                    # "Age"
   18 18                     # unsigned(24)
   64                        # text(4)
   4E616D65                  # "Name"
   64                        # text(4)
   55534552                  # "USER"

1.如何从流中获取密钥。喜欢- Roll_number还是从流中获得年龄?(依次获取键和值也可以)。

2.在得到Roll_number值后,如何跳转到下一个元素("Age")来获取"key“和" value ”。

3.如何识别我在“流的末端”而现在没有数据?

任何代码片段,如何解析和函数的顺序需要遵循。

任何帮助都是感激的。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-10-01 13:47:48

示例代码对于理解API非常有帮助。要迭代映射的键和值,您可以调用cbor_value_enter_container,然后调用cbor_value_advance,直到cbor_value_at_end返回true (只要没有嵌套的映射或数组要查看内部)。例如:

代码语言:javascript
复制
cbor_parser_init(input, sizeof(input), 0, &parser, &it);
if (!cbor_value_is_map(&it)) {
  return 1;
}
err = cbor_value_enter_container(&it, &map);
if (err) return 1;
while (!cbor_value_at_end(&map)) {
  // get the key.  Remember, keys don't have to be strings.
  if (!cbor_value_is_text_string(&map)) {
    return 1;
  }
  char *buf;
  size_t n;
  // Note: this also advances to the value
  err = cbor_value_dup_text_string(&map, &buf, &n, &map);
  if (err) return 1;
  printf("Key: '%*s'\n", (int)n-1, buf);

  if (strncmp(buf, "Age", n-1) == 0) {
    if (cbor_value_is_integer(&map)) {
      // Found the expected key and value type
      err = cbor_value_get_int(&map, &val);
      if (err) return 1;
      printf("age: %d\n", val);
    }
    // note: can't break here, have to keep going until the end if you want
    // `it` to still be valid.
  }
  free(buf);
  err = cbor_value_advance(&map);
  if (err) return 1;
}
err = cbor_value_leave_container(&it, &map);
if (err) return 1;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60716209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档