Кодирование и декодирование uint8_t с использованием библиотеки TinyCbor C - PullRequest
0 голосов
/ 08 июня 2018

Я реализую приложение на основе C ++ 11 и использую библиотеку TinyCbor C для специфических данных приложения для кодирования и декодирования, как показано ниже:

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

using namespace std;

int main() {

    struct MyTest {
        uint8_t varA;
        float vabB;
    };

    MyTest obj;
    obj.varA = 100; // If I set it t0 below 20 then it works 
    obj.varB = 10.10;

    uint8_t buff[100];

    //Encode
    CborEncode encoder;
    CborEncode array;
    cbor_encoder_init(&encoder, buff, sizeof(buff), 0);

    cbor_encoder_create_array(&encode, &array, CborIndefiniteLength);
    cbor_encode_simple_value(&array, obj.varA);
    cbor_encode_float(&array, obj.varB);
    cbor_encoder_close_container(&encoder, &array);

    // Decode 
    CborParser parse;
    CborValue value;
    cbor_parser_init(buff, sizeof(buff), 0, &parser, &value);

    CborValue array;
    cbor_value_enter_container(&value, &array);

    uint8_t val;
    cbor_value_get_simple_type(&array, &val);
    // This prints blank
    cout << "uint8_t value: " << static_cast<int>(val) << endl;

    float fval;
    cbor_value_get_simple_type(&array, &fval);
    cout << "float value: " << fval << endl;

    return 0;
}

Код выше работает, когда я устанавливаю значениеuint8_t varA ниже 20, я вижу, что 20 печатается на консоли, но если я установил больше 20, то иногда это выдает ошибку CborErrorIllegalSimpleType.Или, если значение установлено на 21, то возвращается тип CborBooleanType или CborNullType.

  1. Что не так с кодом

  2. Как кодировать и декодировать uint8_t с помощью TinyCbor.

1 Ответ

0 голосов
/ 14 марта 2019

Используйте CborError cbor_encode_uint(CborEncoder *encoder, uint64_t value) вместо.Эта функция будет кодировать целочисленное значение без знака с наименьшим представлением.

...