Home >Java >javaTutorial >How to Implement Delimited I/O Functions in C for Protocol Buffers?

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

Barbara Streisand
Barbara StreisandOriginal
2024-10-29 13:16:02301browse

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

C Equivalents for Protocol Buffers Delimited I/O Functions in Java

In C , there are no direct equivalents to the "Delimited" I/O functions introduced in Java's Protocol Buffers API version 2.1.0. These functions allow for reading and writing multiple Protocol Buffers messages with length prefixes attached.

Wire Format of Java Delimited I/O Functions

The Java "Delimited" I/O functions use a wire format that is not documented by Google. However, the author of the C and Java protobuf libraries has provided unofficial implementations of similar functions:

<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>

These implementations ensure that the 64MB size limit is applied individually to each message and not to the entire stream. Additionally, they utilize optimizations to improve performance when the message size is relatively small.

The above is the detailed content of How to Implement Delimited I/O Functions in C for Protocol Buffers?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn