nanopb pb_istream_from_buffer - bufsize 的值是多少?

问题描述 投票:0回答:2
pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t bufsize);

buf - 指向要读取的字节数组的指针。
bufsize 字节数组的大小。

bufsize
的论点是什么?是
.pb.h
文件中标题为
/* Maximum encoded size of messages (where known) */
下的宏吗?

simple.c中的示例有点令人困惑,因为它使用为输出示例创建的缓冲区。

我的有效负载可达

2048,编码的最大值为2051;我应该传入哪一个作为 size_t bufsize

c protocol-buffers protobuf-c nanopb
2个回答
0
投票
它是要解码的消息的实际长度。 Protobuf 消息本身没有任何终止符,因此必须将消息数据的长度传递给解码器。


0
投票
我的解决方案是在调用 pb_istream_from_buffer() 之前确定缓冲区中的消息长度。

long protobuf_message_len(void *buf, long offset, unsigned long len) { long start = offset; unsigned long long value; while(offset<=len) { offset = protobuf_read_varint(&value,buf,offset); if (value == 0) return offset-start-1; switch (value & 0x07) { case 0: offset = protobuf_read_varint(&value,buf,offset); break; case 1: offset += 8; break; case 2: offset = protobuf_read_varint(&value,buf,offset); offset += value; break; case 5: offset += 4; break; default: return -2; } } return -1; } unsigned long protobuf_read_varint(unsigned long long *value, void *buf, long offset) { unsigned short i = 0; char byte; *value = 0; while (1) { offset = protobuf_read_byte(&byte, buf, offset); *value |= (unsigned long long)(byte & 0x7F) << i*7; i++; if ((byte & 0x80) == 0) { return offset; } } return 0; } long protobuf_read_byte(char *value, void *buf, long offset) { *value = *((char *) buf + offset); return ++offset; }
    
© www.soinside.com 2019 - 2024. All rights reserved.