首頁 > 後端開發 > C++ > 如何在 C 中實作協定緩衝區的定界 I/O?

如何在 C 中實作協定緩衝區的定界 I/O?

DDD
發布: 2024-12-06 06:11:12
原創
640 人瀏覽過

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

在C 語言中為Protocol Buffers 實作定界I/O 函數

在Java 中,Protocol Buffers 版本2.1.0 引入了2.1.0 引入了定界I/O 函數方便從檔案讀取和寫入多條訊息。這些函數 parseDelimitedFrom、mergeDelimitedFrom 和 writeDelimitedTo 透過將長度前綴附加到訊息來運作。

最初的問題詢問 C 是否存在等效函數。雖然 Java API 提供了這些函數,但官方 C 函式庫最初缺乏它們。但是,從版本 3.3.0 開始,Google 將這些函數加入 google/protobuf/util/delimited_message_util.h。

如果您使用的是舊版的 C 函式庫,則可以使用以下方式實作分隔 I/O以下程式碼:

bool writeDelimitedTo(
    const google::protobuf::MessageLite& message,
    google::protobuf::io::ZeroCopyOutputStream* rawOutput) {
  // Create a new coded stream for each message.
  google::protobuf::io::CodedOutputStream output(rawOutput);

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

  uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size);
  if (buffer != NULL) {
    // Optimization: Serialize message directly to array if it fits.
    message.SerializeWithCachedSizesToArray(buffer);
  } else {
    // Slower path for messages spanning multiple buffers.
    message.SerializeWithCachedSizes(&output);
    if (output.HadError()) return false;
  }

  return true;
}

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

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

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

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

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

  return true;
}
登入後複製

以上是如何在 C 中實作協定緩衝區的定界 I/O?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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