Maison  >  Article  >  Java  >  Existe-t-il des équivalents C pour les fonctions d'E/S \"Delimited\" (parseDelimitedFrom, mergeDelimitedFrom et writeDelimitedTo) introduites dans l'API Java pour Protocol Buffers v2.1.0 ? Sinon, h

Existe-t-il des équivalents C pour les fonctions d'E/S \"Delimited\" (parseDelimitedFrom, mergeDelimitedFrom et writeDelimitedTo) introduites dans l'API Java pour Protocol Buffers v2.1.0 ? Sinon, h

DDD
DDDoriginal
2024-10-28 22:30:02744parcourir

Are there C   equivalents for the

Fonctions d'E/S délimitées pour les tampons de protocole en C

Question :

Le Java L'API pour Protocol Buffers v2.1.0 a introduit un ensemble de fonctions d'E/S « délimitées », notamment parseDelimitedFrom, mergeDelimitedFrom et writeDelimitedTo. Ces fonctions ont-elles des équivalents en C ? Sinon, comment gérer les préfixes de taille des messages en C ?

Réponse :

Depuis la version 3.3.0, Google a ajouté des fonctions d'E/S délimitées au C bibliothèque dans google/protobuf/util/delimited_message_util.h. Cependant, il existe des implémentations alternatives qui offrent davantage d'optimisations et résolvent les pièges potentiels :

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

Ces implémentations garantissent une gestion appropriée des messages dont la taille dépasse 64 Mo, tout en appliquant une limite de 64 Mo aux messages individuels.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn