Maison > Java > javaDidacticiel > Comment implémenter des fonctions d'E/S délimitées en C pour les tampons de protocole ?

Comment implémenter des fonctions d'E/S délimitées en C pour les tampons de protocole ?

Barbara Streisand
Libérer: 2024-10-29 13:16:02
original
290 Les gens l'ont consulté

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

Équivalents C pour les fonctions d'E/S délimitées des tampons de protocole en Java

En C, il n'y a pas d'équivalents directs au I "Délimité" Fonctions /O introduites dans l'API Protocol Buffers de Java version 2.1.0. Ces fonctions permettent de lire et d'écrire plusieurs messages de tampons de protocole avec des préfixes de longueur attachés.

Format filaire des fonctions d'E/S délimitées Java

Les E/S "délimitées" Java Les fonctions O utilisent un format filaire qui n'est pas documenté par Google. Cependant, l'auteur des bibliothèques protobuf C et Java a fourni des implémentations non officielles de fonctions similaires :

<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>
Copier après la connexion

Ces implémentations garantissent que la limite de taille de 64 Mo est appliquée individuellement à chaque message et non à l'ensemble du flux. De plus, ils utilisent des optimisations pour améliorer les performances lorsque la taille du message est relativement petite.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal