Heim  >  Artikel  >  Java  >  Gibt es C-Äquivalente für die „Delimited“-E/A-Funktionen (parseDelimitedFrom, mergeDelimitedFrom und writeDelimitedTo), die in der Java API für Protocol Buffers v2.1.0 eingeführt wurden? Wenn nicht, h

Gibt es C-Äquivalente für die „Delimited“-E/A-Funktionen (parseDelimitedFrom, mergeDelimitedFrom und writeDelimitedTo), die in der Java API für Protocol Buffers v2.1.0 eingeführt wurden? Wenn nicht, h

DDD
DDDOriginal
2024-10-28 22:30:02751Durchsuche

Are there C   equivalents for the

Begrenzte I/O-Funktionen für Protokollpuffer in C

Frage:

Das Java API for Protocol Buffers v2.1.0 führte eine Reihe „getrennter“ E/A-Funktionen ein, darunter parseDelimitedFrom, mergeDelimitedFrom und writeDelimitedTo. Haben diese Funktionen C-Äquivalente? Wenn nicht, wie können Nachrichtengrößenpräfixe in C gehandhabt werden?

Antwort:

Ab Version 3.3.0 hat Google dem C getrennte E/A-Funktionen hinzugefügt Bibliothek in google/protobuf/util/delimited_message_util.h. Es gibt jedoch alternative Implementierungen, die weitere Optimierungen bieten und potenzielle Fallstricke beseitigen:

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

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

  // Optimize for messages that fit in a single buffer.
  uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size);
  if (buffer != NULL) {
    message.SerializeWithCachedSizesToArray(buffer);
    return true;
  }

  // Slower path for messages that span multiple buffers.
  message.SerializeWithCachedSizes(&amp;output);
  return !output.HadError();
}

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 size.
  uint32_t size;
  if (!input.ReadVarint32(&amp;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(&amp;input)) return false;
  if (!input.ConsumedEntireMessage()) return false;

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

  return true;
}</code>

Diese Implementierungen gewährleisten die ordnungsgemäße Verarbeitung von Nachrichten mit einer Größe von mehr als 64 MB und erzwingen gleichzeitig eine Beschränkung auf 64 MB für einzelne Nachrichten.

Das obige ist der detaillierte Inhalt vonGibt es C-Äquivalente für die „Delimited“-E/A-Funktionen (parseDelimitedFrom, mergeDelimitedFrom und writeDelimitedTo), die in der Java API für Protocol Buffers v2.1.0 eingeführt wurden? Wenn nicht, h. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn