如何使用解压后的数据 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.typeMSGPACK_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.size3.

  • obj.via.array.ptr[0].typeMSGPACK_OBJECT_POSITIVE_INTEGER.
  • obj.via.array.ptr[0].via.u641.

  • obj.via.array.ptr[1].typeMSGPACK_OBJECT_BOOLEAN.
  • obj.via.array.ptr[1].via.booltrue.

  • obj.via.array.ptr[2].typeMSGPACK_OBJECT_STR
    • obj.via.array.ptr[2].via.str.ptr"example"(第一个字符e存放的内存地址)。
    • obj.via.array.ptr[2].via.str.size7.

How can I store the first index of the array in a variable ?

所以你可以这样做:

uint64_t store_value = obj.via.array.ptr[0].via.u64;