看代码:这里是加密吧encode_basic_field这函数 是调用其他函数
static bool checkreturn encode_basic_field(pb_ostream_t *stream,
const pb_field_t *field, const void *pData)
{
pb_encoder_t func;
bool implicit_has;
const void *pSize = &implicit_has;
func = PB_ENCODERS[PB_LTYPE(field->type)];
也即是在数组PB_ENCODERS中那一个函数用!
static const pb_encoder_t PB_ENCODERS[PB_LTYPES_COUNT] = {
&pb_enc_varint,
&pb_enc_uvarint,
&pb_enc_svarint,
&pb_enc_fixed32,
&pb_enc_fixed64,
&pb_enc_bytes,
&pb_enc_string,
&pb_enc_submessage,
NULL, /* extensions */
&pb_enc_fixed_length_bytes
};
这个数组的类型是:pb_encoder_t
typedef bool (*pb_encoder_t)(pb_ostream_t *stream, const pb_field_t *field, const void *src) checkreturn;
数组里面的成员都是写好的
比如一个成员
static bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_field_t *field, const void *src);
问题:如何用的?encode_basic_field 也是内部的
唯一用 encode_basic_field 的是 encode_field
static bool checkreturn encode_field(pb_ostream_t *stream,
const pb_field_t *field, const void *pData)
{
switch (PB_ATYPE(field->type))
{
case PB_ATYPE_STATIC:
case PB_ATYPE_POINTER:
return encode_basic_field(stream, field, pData);
再次唯一用 encode_field 不带static的是 pb_encode
bool checkreturn pb_encode(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct)
{
pb_field_iter_t iter;
if (!pb_field_iter_begin(&iter, fields, pb_const_cast(src_struct)))
return true; /* Empty message type */
do {
if (PB_LTYPE(iter.pos->type) == PB_LTYPE_EXTENSION)
{
/* Special case for the extension field placeholder */
if (!encode_extension_field(stream, iter.pos, iter.pData))
return false;
}
else
{
/* Regular field */
if (!encode_field(stream, iter.pos, iter.pData))
return false;
}
} while (pb_field_iter_next(&iter));
return true;
}
也就是关系函数pb_encode即可
来源:https://blog.csdn.net/weixin_42381351/article/details/100982800