首頁  >  文章  >  Java  >  如何在 C 語言中為 Protocol Buffer 實現定界 I/O?

如何在 C 語言中為 Protocol Buffer 實現定界 I/O?

Susan Sarandon
Susan Sarandon原創
2024-10-30 02:47:03772瀏覽

 How to Implement Delimited I/O in C   for Protocol Buffers?

Protocol Buffers 中的分隔I/O 函數:C 等效項

從兩個協定緩衝區中的檔案讀取或寫入多個Protocol Buffers 訊息的情況下C 和Java,有必要在訊息中附加長度前綴。雖然 Java API 為此目的提供了專用的「定界」I/O 函數,但它們在 C 中的等效函數可能並不明顯。

最近的更新表明此類 C 等效函數現在駐留在 google/protobuf/util 中/delimited_message_util.h 作為版本 3.3.0 的一部分。然而,在此更新之前,有一些替代實作可以有效地滿足此要求。

其中一個實作由 C 和 Java protobuf 函式庫的前作者提供,包括防止 64MB 輸入後潛在故障的最佳化。如下圖所示,這些實作對單一訊息強制實施 64MB 限制,確保串流媒體無縫繼續進行而不超過整體限制。

針對C 的最佳化定界I/O 實作

<code class="cpp">bool writeDelimitedTo(
    const google::protobuf::MessageLite&amp; message,
    google::protobuf::io::ZeroCopyOutputStream* rawOutput) {
  // Initialize a CodedOutputStream for each message.
  google::protobuf::io::CodedOutputStream output(rawOutput);

  // Determine the message size and write it as a Varint.
  int size = message.ByteSize();
  output.WriteVarint32(size);

  // Optimize for messages fitting into a single buffer.
  uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size);
  if (buffer != NULL) message.SerializeWithCachedSizesToArray(buffer);
  else message.SerializeWithCachedSizes(&amp;output);

  return true;
}

bool readDelimitedFrom(
    google::protobuf::io::ZeroCopyInputStream* rawInput,
    google::protobuf::MessageLite* message) {
  // Initialize a CodedInputStream for each message.
  google::protobuf::io::CodedInputStream input(rawInput);

  // Read the message size.
  uint32_t size;
  if (!input.ReadVarint32(&amp;size)) return false;

  // Restrict reading to the determined message size.
  google::protobuf::io::CodedInputStream::Limit limit =
      input.PushLimit(size);

  // Parse the message and verify it fits within the limit.
  if (!message->MergeFromCodedStream(&amp;input)) return false;
  if (!input.ConsumedEntireMessage()) return false;

  // Lift the reading restriction.
  input.PopLimit(limit);

  return true;
}</code>

這些最佳化的實作有效地處理不同大小的訊息,並為C 中的分隔I /O 提供可靠的解決方案。

以上是如何在 C 語言中為 Protocol Buffer 實現定界 I/O?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn