我正在尝试使用tinyCBOR解析CBOR流。目标是为“映射类型”编写一个通用解析代码(因为我不知道在cbor流中有多少个键以及它们是哪些),但不是对于一个json,我只想使用“键”获取值,但是要从键中获取值,我必须知道键。Im只需在函数中传递"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还是从流中获得年龄?(依次获取键和值也可以)。
2.在得到Roll_number值后,如何跳转到下一个元素("Age")来获取"key“和" value ”。
3.如何识别我在“流的末端”而现在没有数据?
任何代码片段,如何解析和函数的顺序需要遵循。
任何帮助都是感激的。谢谢!
发布于 2020-10-01 13:47:48
示例代码对于理解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;https://stackoverflow.com/questions/60716209
复制相似问题