Проблема при кодировании и декодировании с использованием CBOR - PullRequest
0 голосов
/ 09 мая 2018

У меня есть класс ниже, который я хочу декодировать и кодировать, используя TinyCBOR .

class Test { 
public:  
  int a; 
  int b;
  float c;
}

Я делаю следующее для кодирования и декодирования этого класса:

int main () {

   Test t;
   t.a = 10;
   t.b = 20;
   t.c = 3.30;

   // Encode values 
   uint8_t buf[40];
   CborEncoder encoder;
   cbor_encoder_init(&encoder, &buf, sizeof(buf), 0);
   cbor_encode_int(&encoder, t.a);
   cbor_encode_int(&encoder, t.b);
   cbor_encode_float(&encoder, t.c);


   // Decode values
   CborParser parser;
   CborValue value;
   int a;
   int b;
   float c;

   cbor_parser_init(buf, sizeof(buf), 0, &parser, &value);
   cbor_value_get_int(&value, &a);
   cout << "Int A: " << a << endl;

   cbor_value_get_int(&value, &b);
   cout << "Int B: " << b << endl;

   cbor_value_get_float(&value, &c);
   cout << "Float C: " << c << endl;

   return 0;
}

Проблема в том, что моя программа печатает:

A: 10
B: 10

И это дает ошибку при чтении с плавающей точкой.

В чем может быть проблема?
Я также пытался добавить cbor_value_advance_fixed(&value);, но результат тот же.
Также я не нашел ни одного примера кодирования / декодирования нескольких значений на сайте TinyCBOR .

1 Ответ

0 голосов
/ 07 февраля 2019

Документация действительно неясна, в них нет примеров, но, очевидно, вам нужно сгруппировать данные в карту или массив.

#include <iostream>
#include "cbor.h"

using namespace std;

class Test {
public:
    int a;
    int b;
    float c;
};

int main ()
{
    Test t;
    t.a = 10;
    t.b = 20;
    t.c = 3.30;

    // Encode values
    uint8_t buf[40];
    CborEncoder encoder, array;
    cbor_encoder_init(&encoder, buf, sizeof(buf), 0);
    cbor_encoder_create_array(&encoder, &array, 3);
    cbor_encode_int(&array, t.a);
    cbor_encode_int(&array, t.b);
    cbor_encode_float(&array, t.c);
    cbor_encoder_close_container(&encoder, &array);

    // Decode values
    CborParser parser;
    CborValue it, recursed;
    int a;
    int b;
    float c;

    cbor_parser_init(buf, sizeof(buf), 0, &parser, &it);
    cbor_value_enter_container(&it, &recursed);
    cbor_value_get_int(&recursed, &a);
    cbor_value_advance_fixed(&recursed);
    cout << "Int A: " << a << endl;

    cbor_value_get_int(&recursed, &b);
    cbor_value_advance_fixed(&recursed);
    cout << "Int B: " << b << endl;

    cbor_value_get_float(&recursed, &c);
    cbor_value_advance_fixed(&recursed);
    cout << "Float C: " << c << endl;
    cbor_value_leave_container(&it, &recursed);

    return 0;
}
...