Search code examples
c++decodeencodecbor

Issue while encoding and decoding using CBOR


I have below class which I want to decode and encode using TinyCBOR.

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

I am doing following to encode and decode this class:

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;
}

Issue is that my program prints:

A: 10
B: 10

And it givens error for reading float.

What can be the issue?
I have also tried to add cbor_value_advance_fixed(&value); but result is same.
Also I don't find any example of encode/decode multiple values on TinyCBOR site.


Solution

  • The documentation is really not clear and they lack in examples but apparently, you have to group the data in a map or array.

    #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;
    }