[英]How to read the message of a specific size from `GzipInputStream` in protobuf in C++?
我想從網絡套接字中讀取特定大小的消息。 大小在消息本身之前編碼。 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
字節? -我建議使用前者,因為因此無法從同一套接字正確讀取兩條消息。
如何從GzipInputStream
正確讀取特定大小的消息( SerializeAsString().size()
)?
要點並不矛盾。 由於ParseFromBoundedZeroCopyStream
不知道ParseFromBoundedZeroCopyStream
哪種流中讀取數據,因此文檔當然是指從流中獲取的數據大小(解壓縮后)。 它將從流中准確讀取未壓縮字節的size
,並將其解釋為一條消息。 如果您只知道消息的壓縮大小,則不能使用此方法。 您將不得不做一些更復雜的事情,例如,將GzipInputStream
放在LimitingInputStream
之上。
(還請注意,如果該方法返回false表示失敗,則它可能已提前停止讀取,從而使流處於不確定狀態。如果這是一個問題,則必須執行一些更復雜的操作才能確保您閱讀了即使在解析錯誤的情況下也要保留完整大小,例如您自己設置LimitingInputStream
並在解析失敗后顯式清空數據。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.