如何使用解压后的数据 msgpack -c
How to use unpacked data msgpack-c
我知道如何解包数据但不知道如何使用数组或映射中的特定数据,这是代码:
#include <msgpack.h>
#include <stdio.h>
int main(void) {
/* msgpack::sbuffer is a simple buffer implementation. */
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
/* serialize values into the buffer using msgpack_sbuffer_write callback
* function. */
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_array(&pk, 3);
msgpack_pack_int(&pk, 1);
msgpack_pack_true(&pk);
msgpack_pack_str(&pk, 7);
msgpack_pack_str_body(&pk, "example", 7);
msgpack_unpacked result;
size_t off = 0;
msgpack_unpack_return ret;
int i = 0;
msgpack_unpacked_init(&result);
ret = msgpack_unpack_next(&result, sbuf.data, sbuf.size, &off);
while (ret == MSGPACK_UNPACK_SUCCESS) {
msgpack_object obj = result.data;
printf("Object on %d:\n", ++i);
msgpack_object_print(stdout, obj);
printf("\n");
ret = msgpack_unpack_next(&result, sbuf.data, sbuf.size, &off);
}
msgpack_unpacked_destroy(&result);
return 0;
}
如何将数组的第一个索引存储在变量中?
msgpack-c(C版)文档在这里:
https://github.com/msgpack/msgpack-c/wiki/v2_0_c_overview#object
在你的例子中,变量 obj
的类型是 msgpack_object。
typedef struct msgpack_object {
msgpack_object_type type;
msgpack_object_union via;
} msgpack_object;
msgpack_object_union
定义如下:
typedef union {
bool boolean;
uint64_t u64;
int64_t i64;
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
double dec; /* obsolete*/
#endif /* MSGPACK_USE_LEGACY_NAME_AS_FLOAT */
double f64;
msgpack_object_array array;
msgpack_object_map map;
msgpack_object_str str;
msgpack_object_bin bin;
msgpack_object_ext ext;
} msgpack_object_union;
msgpack_object_array
定义如下:
typedef struct {
uint32_t size;
struct msgpack_object* ptr;
} msgpack_object_array;
obj.type
是 MSGPACK_OBJECT_ARRAY
。
您可以使用成员 via
访问数组元素。
例如,您可以访问数组的第一个索引 obj.via.array.ptr[0]
.
当您打包如下:
msgpack_pack_array(&pk, 3);
msgpack_pack_int(&pk, 1);
msgpack_pack_true(&pk);
msgpack_pack_str(&pk, 7);
msgpack_pack_str_body(&pk, "example", 7);
obj 具有以下值:
obj.via.array.size
是 3
.
obj.via.array.ptr[0].type
是 MSGPACK_OBJECT_POSITIVE_INTEGER
.
obj.via.array.ptr[0].via.u64
是 1
.
obj.via.array.ptr[1].type
是 MSGPACK_OBJECT_BOOLEAN
.
obj.via.array.ptr[1].via.bool
是 true
.
obj.via.array.ptr[2].type
是 MSGPACK_OBJECT_STR
。
obj.via.array.ptr[2].via.str.ptr
是"example"
(第一个字符e
存放的内存地址)。
obj.via.array.ptr[2].via.str.size
是 7
.
How can I store the first index of the array in a variable ?
所以你可以这样做:
uint64_t store_value = obj.via.array.ptr[0].via.u64;
我知道如何解包数据但不知道如何使用数组或映射中的特定数据,这是代码:
#include <msgpack.h>
#include <stdio.h>
int main(void) {
/* msgpack::sbuffer is a simple buffer implementation. */
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
/* serialize values into the buffer using msgpack_sbuffer_write callback
* function. */
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_array(&pk, 3);
msgpack_pack_int(&pk, 1);
msgpack_pack_true(&pk);
msgpack_pack_str(&pk, 7);
msgpack_pack_str_body(&pk, "example", 7);
msgpack_unpacked result;
size_t off = 0;
msgpack_unpack_return ret;
int i = 0;
msgpack_unpacked_init(&result);
ret = msgpack_unpack_next(&result, sbuf.data, sbuf.size, &off);
while (ret == MSGPACK_UNPACK_SUCCESS) {
msgpack_object obj = result.data;
printf("Object on %d:\n", ++i);
msgpack_object_print(stdout, obj);
printf("\n");
ret = msgpack_unpack_next(&result, sbuf.data, sbuf.size, &off);
}
msgpack_unpacked_destroy(&result);
return 0;
}
如何将数组的第一个索引存储在变量中?
msgpack-c(C版)文档在这里: https://github.com/msgpack/msgpack-c/wiki/v2_0_c_overview#object
在你的例子中,变量 obj
的类型是 msgpack_object。
typedef struct msgpack_object {
msgpack_object_type type;
msgpack_object_union via;
} msgpack_object;
msgpack_object_union
定义如下:
typedef union {
bool boolean;
uint64_t u64;
int64_t i64;
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
double dec; /* obsolete*/
#endif /* MSGPACK_USE_LEGACY_NAME_AS_FLOAT */
double f64;
msgpack_object_array array;
msgpack_object_map map;
msgpack_object_str str;
msgpack_object_bin bin;
msgpack_object_ext ext;
} msgpack_object_union;
msgpack_object_array
定义如下:
typedef struct {
uint32_t size;
struct msgpack_object* ptr;
} msgpack_object_array;
obj.type
是 MSGPACK_OBJECT_ARRAY
。
您可以使用成员 via
访问数组元素。
例如,您可以访问数组的第一个索引 obj.via.array.ptr[0]
.
当您打包如下:
msgpack_pack_array(&pk, 3);
msgpack_pack_int(&pk, 1);
msgpack_pack_true(&pk);
msgpack_pack_str(&pk, 7);
msgpack_pack_str_body(&pk, "example", 7);
obj 具有以下值:
obj.via.array.size
是3
.
obj.via.array.ptr[0].type
是MSGPACK_OBJECT_POSITIVE_INTEGER
.obj.via.array.ptr[0].via.u64
是1
.
obj.via.array.ptr[1].type
是MSGPACK_OBJECT_BOOLEAN
.obj.via.array.ptr[1].via.bool
是true
.
obj.via.array.ptr[2].type
是MSGPACK_OBJECT_STR
。obj.via.array.ptr[2].via.str.ptr
是"example"
(第一个字符e
存放的内存地址)。obj.via.array.ptr[2].via.str.size
是7
.
How can I store the first index of the array in a variable ?
所以你可以这样做:
uint64_t store_value = obj.via.array.ptr[0].via.u64;