首頁 > Java > java教程 > 如何在 C 語言中為 Protocol Buffer 實作定界 I/O 函數?

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

Barbara Streisand
發布: 2024-10-29 13:16:02
原創
290 人瀏覽過

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

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

在C 中,沒有與「分隔」I 直接等效的函數/O 函數在Java 的Protocol Buffers API 版本2.1.0 中引入。這些函數允許讀取和寫入附加長度前綴的多個 Protocol Buffers 訊息。

Java 分隔 I/O 函數的連線格式

Java「分隔」I/ O 函數使用 Google 未記錄的有線格式。然而,C 和 Java protobuf 函式庫的作者提供了類似功能的非官方實作:

<code class="cpp">bool writeDelimitedTo(
    const google::protobuf::MessageLite& message,
    google::protobuf::io::ZeroCopyOutputStream* rawOutput) {

  // Write the size.
  const int size = message.ByteSize();
  output.WriteVarint32(size);

  // Serialize the message.
  uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size);
  if (buffer != NULL) {
    message.SerializeWithCachedSizesToArray(buffer);
  } else {
    message.SerializeWithCachedSizes(&output);
  }

  return true;
}

bool readDelimitedFrom(
    google::protobuf::io::ZeroCopyInputStream* rawInput,
    google::protobuf::MessageLite* message) {

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

  // Limit the stream to the size of the message.
  google::protobuf::io::CodedInputStream::Limit limit =
      input.PushLimit(size);

  // Parse the message.
  if (!message->MergeFromCodedStream(&input)) return false;

  // Verify that the entire message was consumed.
  if (!input.ConsumedEntireMessage()) return false;

  // Release the limit.
  input.PopLimit(limit);

  return true;
}</code>
登入後複製

這些實作確保 64MB 大小限制單獨應用於每個訊息,而不是整個流。此外,當訊息大小相對較小時,他們利用最佳化來提高效能。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板