C++ 如何在C+中从protobuf中的“gzip输入流”读取特定大小的消息+;?

C++ 如何在C+中从protobuf中的“gzip输入流”读取特定大小的消息+;?,c++,gzip,protocol-buffers,C++,Gzip,Protocol Buffers,我想从网络套接字读取特定大小的消息。大小在消息本身之前进行编码。size+消息是用GzipOutputStream压缩的 下面是我的解码器的简化示例代码: unsigned size; GzipInputStream gzip_stream(&file_input_stream_, GzipInputStream::ZLIB); { CodedInputStream coded_stream(&gzip_stream); coded_stream.ReadVarint32

我想从网络套接字读取特定大小的消息。大小在消息本身之前进行编码。size+消息是用
GzipOutputStream
压缩的

下面是我的解码器的简化示例代码:

unsigned size;
GzipInputStream gzip_stream(&file_input_stream_, GzipInputStream::ZLIB);
{
  CodedInputStream coded_stream(&gzip_stream);
  coded_stream.ReadVarint32(&size);
}

message->ParseFromBoundedZeroCopyStream(&gzip_stream, size);
MessageLite::ParseFromBoundedZeroCopyStream()
的文档中有相反的陈述:

  • 从给定的零拷贝输入流读取协议缓冲区,期望消息的长度正好是“大小”字节
  • 如果成功,那么输入将消耗这么多字节
所以,我很困惑-这个函数是从流中读取
size
字节,还是期望得到
size
bytes的消息我建议使用前者,因为我无法正确读取来自同一套接字的两条消息


问题:
如何正确阅读来自
gzip输入流的特定大小(
SerializeAsString().size()
)的消息?

要点并不矛盾。由于
ParseFromBoundedZeroCopyStream
不知道它从哪种类型的流中读取,因此文档当然是指解压后从流中获取的数据的大小。它将从流中准确读取
size
未压缩的字节,并将它们解释为单个消息。如果您只知道消息的压缩大小,则无法使用此方法;您必须执行更复杂的操作,例如,将
gzip输入流
分层到
限制输入流
之上

(还请注意,如果该方法返回false表示失败,那么它可能已经提前停止读取,使流处于不确定状态。如果这是一个问题,则您必须执行更复杂的操作,以确保即使在出现解析错误的情况下也能读取完整大小,例如设置
LimitingInputStream
自己d在解析失败后显式地排空数据。)