簡體   English   中英

如何在C ++中的protobuf中從`GzipInputStream`中讀取特定大小的消息?

[英]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()的文檔中,有相反的聲明:

  • 從給定的零拷貝輸入流中讀取協議緩沖區, 期望消息的長度恰好是“大小”字節
  • 如果成功的話,那么正是input會消耗這么多字節

所以,我很困惑-這個函數會從流中讀取size字節,還是期望消息size字節? -我建議使用前者,因為因此無法從同一套接字正確讀取兩條消息。


題:

如何從GzipInputStream正確讀取特定大小的消息( SerializeAsString().size() )?

要點並不矛盾。 由於ParseFromBoundedZeroCopyStream不知道ParseFromBoundedZeroCopyStream哪種流中讀取數據,因此文檔當然是指從流中獲取的數據大小(解壓縮后)。 它將從流中准確讀取未壓縮字節的size ,並將其解釋為一條消息。 如果您只知道消息的壓縮大小,則不能使用此方法。 您將不得不做一些更復雜的事情,例如,將GzipInputStream放在LimitingInputStream之上。

(還請注意,如果該方法返回false表示失敗,則它可能已提前停止讀取,從而使流處於不確定狀態。如果這是一個問題,則必須執行一些更復雜的操作才能確保您閱讀了即使在解析錯誤的情況下也要保留完整大小,例如您自己設置LimitingInputStream並在解析失敗后顯式清空數據。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM