【问题标题】:Parsing cbor stream解析 cbor 流
【发布时间】:2020-03-17 04:19:33
【问题描述】:

我正在尝试使用 tinyCBOR 解析 CBOR 流。目标是为“ma​​p type”编写一个通用解析代码(因为我不知道在 cbor 流中有多少个键以及它们是什么)但不是 json,我只是想要使用“key”获取值,但要从键获取值我必须知道键。 我只是能够通过在函数中传递“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.如何从流中获取密钥。 like - 从流中获取 Roll_number 或 AGE?(依次获取键和值也可以)。

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

3.如何确定我在“流结束”处到达并且现在没有数据??

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

感谢您的帮助。 谢谢!!!

【问题讨论】:

    标签: parsing containers decoding cbor


    【解决方案1】:

    example code 对理解 API 非常有帮助。要遍历映射的键和值,请调用 cbor_value_enter_container,然后调用 cbor_value_advance 直到 cbor_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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-23
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多