msgpack упаковывает массив символов в C

Как мне работать с msgpack_pack_raw и msgpack_pack_raw_body, чтобы отправить неподписанный массив символов, что более важно, как его получить (распаковать)? Я сделал следующее:

msgpack_sbuffer* buffer = msgpack_sbuffer_new();
msgpack_packer* pk = msgpack_packer_new(buffer, msgpack_sbuffer_write);
msgpack_sbuffer_clear(buffer);
msgpack_pack_array(pk, 10);

unsigned char a[10] = "0123456789";
msgpack_pack_raw(pk, 10);
msgpack_pack_raw_body(pk,a,10);

и в части приемника у меня есть:

msgpack_unpacked msg;
msgpack_unpacked_init(&msg);
msgpack_unpack_next(&msg, buffer->data, buffer->size, NULL);
msgpack_object obj = msg.data;
msgpack_object* p = obj.via.array.ptr;
int length = (*p).via.raw.size;
IDPRINT(length);
unsigned char* b = (unsigned char*) malloc(length);
memcpy(b,(*p).via.raw.ptr,length);

Но он выдает ошибку сегмента при выполнении «int length = (*p).via.raw.size;».

Есть идеи, почему?


person Arash    schedule 11.10.2013    source источник
comment
Может помочь отладка с помощью Valgrind. Я подозреваю, что вы пытаетесь получить доступ к указателю NULL.   -  person Dayal rai    schedule 11.10.2013


Ответы (1)


Есть идеи, почему?

Это потому, что msgpack_pack_array(pk, 10); здесь не требуется, поскольку вы упаковываете свои данные как необработанный буфер заданного размера. Другими словами, msgpack_pack_raw и msgpack_pack_raw_body достаточно.

Во время распаковки вы должны получить доступ к его полям следующим образом:

  1. длина: obj.via.raw.size
  2. данные: obj.via.raw.ptr

см.: msgpack_object_raw в object.h.

Вот краткий обзор того, как действовать:

#include <stdio.h>
#include <assert.h>
#include <msgpack.h>

int main(void) {
  unsigned char a[10] = "0123456789";

  char *buf = NULL;
  int size;

  /* -- PACK -- */
  msgpack_sbuffer sbuf;
  msgpack_sbuffer_init(&sbuf);
  msgpack_packer pck;
  msgpack_packer_init(&pck, &sbuf, msgpack_sbuffer_write);

  msgpack_pack_raw(&pck, 10);
  msgpack_pack_raw_body(&pck, a, 10);

  size = sbuf.size;
  buf = malloc(sbuf.size);
  memcpy(buf, sbuf.data, sbuf.size);
  msgpack_sbuffer_destroy(&sbuf);

  /* -- UNPACK -- */
  unsigned char *b = NULL;
  int bsize = -1;

  msgpack_unpacked msg;
  msgpack_unpacked_init(&msg);
  if (msgpack_unpack_next(&msg, buf, size, NULL)) {
    msgpack_object root = msg.data;
    if (root.type == MSGPACK_OBJECT_RAW) {
      bsize = root.via.raw.size;
      b = malloc(bsize);
      memcpy(b, root.via.raw.ptr, bsize);
    }
  }

  /* -- CHECK -- */
  assert(bsize == 10);
  assert(b != NULL);
  for (int i = 0; i < bsize; i++)
    assert(b[i] == a[i]);

  printf("ok\n");

  free(buf);
  free(b);

  return 0;
}
person deltheil    schedule 14.10.2013