【发布时间】:2018-06-08 14:33:24
【问题描述】:
我正在实现基于 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。
代码有什么问题
如何使用 TinyCbor 对
uint8_t进行编码和解码。
【问题讨论】:
-
我刚刚看了github(出于好奇)。我相信您使用了错误的功能来实现您的意图。如果我理解正确
cbor_encode_simple_value()会编码类型标识之类的东西。因此,只接受注册类型的值(似乎只有 20 或 21 个)。append_to_buffer()或cbor_encode_uint()似乎是更好的选择。 (请注意,我以前从未听说过 TinyCbor。)