如何配置nanopb/protobuf始终按最大大小序列化,无需传递bytes_written
解决方法
要让nanopb始终以固定长度(无优化)的方式序列化结构体,使得解码时可以直接用常量宏作为bufsize,你可以通过以下步骤实现:
在.proto文件中启用固定长度序列化
给目标消息添加nanopb_options = {fixed_length: true};选项,这会强制nanopb序列化时按消息的最大可能长度填充缓冲区,所有字段(包括可选字段)都会占据预设的固定空间,未赋值的字段会用零填充。示例.proto代码:
message TargetMessage { option nanopb_options = {fixed_length: true}; int32 user_id = 1; // 字符串/bytes类型必须指定max_size,用于固定长度分配 string username = 2 [(nanopb).max_size = 32]; bool is_active = 3; }使用生成的固定长度宏
编译.proto文件后,nanopb会自动生成TargetMessage_size宏,这个值就是该消息的固定最大长度。序列化时,用这个宏初始化缓冲区:pb_byte_t buffer[TargetMessage_size]; pb_ostream_t stream = pb_ostream_from_buffer(buffer, TargetMessage_size); pb_encode(&stream, TargetMessage_fields, &your_message);此时整个缓冲区都会被填充为固定长度的序列化数据,无需关注
stream.bytes_written。解码时直接用固定长度宏
解码端直接将TargetMessage_size作为bufsize传入pb_istream_from_buffer即可:pb_istream_t stream = pb_istream_from_buffer(received_buffer, TargetMessage_size); pb_decode(&stream, TargetMessage_fields, &decoded_message);
注意:这种方式会增加数据传输的体积(因为要预留所有字段的最大空间),但能满足你只能传递单一缓冲区的接口限制。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

