使用CBOR进行编码和解码时出现问题

时间:2018-05-09 10:10:04

标签: c++ decode encode cbor

我有下面的类,我想使用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 :(得分:1)

该文档确实不清楚,并且缺少示例,但是显然,您必须将数据分组到一个映射或数组中。

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