创建回调和结构为重复场的protobuf的消息中nanopb我有限定的原消息为:在C
message SimpleMessage {
repeated int32 number = 1;}
现在,编译后,场是pb_callback_t
,我想编写功能。 (没有.options文件)
现在,在哪里以及该函数应包含哪些内容?数据本身存储在哪里以及如何访问数据/向其分配新数据?
*编辑*
根据@Groo的答案,这是我尝试的代码:
typedef struct {
int numbers_decoded;
} DecodingState;
bool read_single_number(pb_istream_t *istream, const pb_field_t *field, void **arg)
{
// get the pointer to the custom state
DecodingState *state = (DecodingState*)(*arg);
int32_t value;
if (!pb_decode_varint32(istream, &value))
{
const char * error = PB_GET_ERROR(istream);
printf("Protobuf error: %s", error);
return false;
}
printf("Decoded successfully: %d", value);
state->numbers_decoded++;
return true;
}
int main(void) {
int32_t arr[3] = {10, 22, 342};
uint8_t buffer[128];
size_t message_length;
bool status;
SimpleMessage simple = SimpleMessage_init_zero;
printf("\nbefore : arr[0] = %d\n",arr[0]);
// set the argument and the callback fn
simple.number.arg = &arr;
simple.number.funcs.decode = read_single_number;
pb_ostream_t ostream = pb_ostream_from_buffer(buffer, sizeof(buffer));
status = pb_encode(&ostream, SimpleMessage_fields, &simple);
message_length = ostream.bytes_written;
SimpleMessage simple1 = SimpleMessage_init_zero;
simple = simple1;
arr[0] = 0;
pb_istream_t istream = pb_istream_from_buffer(buffer, message_length);
// this function will call read_single_number several times
status = pb_decode(&istream, SimpleMessage_fields, &simple);
printf("\nafter : arr[0] = %d\n",arr[0]);
return EXIT_SUCCESS;
}
并且输出是:
之前:ARR [ 0] = 10
解码成功:17
后:常用3 [0] = 0
我该怎么办错了吗?
它不起作用。将我的代码添加到原始问题中。 –
@ItayPupko:你使用了错误的(解码)回调进行编码,应该有两个单独的回调(一个用于写入,一个用于读取)。我已经用编码和解码代码更新了我的答案。 – Groo