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
Barbara Streisandoriginal
2024-10-29 13:16:02292parcourir

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>

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!

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