Я реализую приложение на основе 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
.
Что не так с кодом
Как кодировать и декодировать
uint8_t
с помощью TinyCbor.
cbor_encode_simple_value()
кодирует что-то вроде идентификации типа. Следовательно, принимаются значения только для зарегистрированных типов (а их, кажется, всего 20 или 21).append_to_buffer()
илиcbor_encode_uint()
кажется лучшим выбором. (Обратите внимание, что я никогда раньше не слышал о TinyCbor.) - person Scheff's Cat   schedule 08.06.2018