2

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

cbor_value_map_find_value(&main_value,"Age",&map_value);

但我仍然不清楚。

从 CBOR 流中获取键和值要遵循什么顺序?

例如。以下是我的地图格式数据-

{"Roll_number": 7, "Age": 24, "Name": "USER"}

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

   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 或 AGE?(依次获取键和值也可以)。

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

3.如何识别我在“流结束”时到达,现在没有数据??

任何片段代码,如何解析以及需要遵循哪个函数序列。

任何帮助表示赞赏。谢谢!!!

4

1 回答 1

0

示例代码对于理解 API 非常有帮助。要遍历映射的键和值,您调用cbor_value_enter_container,然后cbor_value_advanceuntilcbor_value_at_end返回 true(只要您不希望在其中查看嵌套映射或数组)。例如:

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;
于 2020-10-01T13:47:48.023 回答