Maison > développement back-end > C++ > Comment puis-je implémenter des E/S délimitées pour les tampons de protocole en C ?

Comment puis-je implémenter des E/S délimitées pour les tampons de protocole en C ?

DDD
Libérer: 2024-12-06 06:11:12
original
677 Les gens l'ont consulté

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

Implémentation de fonctions d'E/S délimitées en C pour les tampons de protocole

En Java, la version 2.1.0 des tampons de protocole a introduit les fonctions d'E/S délimitées pour faciliter la lecture et l'écriture de plusieurs messages à partir de fichiers. Ces fonctions, parseDelimitedFrom, mergeDelimitedFrom et writeDelimitedTo, fonctionnent en attachant des préfixes de longueur aux messages.

La question initiale portait sur l'existence de fonctions équivalentes pour C . Bien que l’API Java fournisse ces fonctions, la bibliothèque C officielle en manquait au départ. Cependant, à partir de la version 3.3.0, Google a ajouté ces fonctions à google/protobuf/util/delimited_message_util.h.

Si vous utilisez une ancienne version de la bibliothèque C, vous pouvez implémenter des E/S délimitées en utilisant le code suivant :

bool writeDelimitedTo(
    const google::protobuf::MessageLite& message,
    google::protobuf::io::ZeroCopyOutputStream* rawOutput) {
  // Create a new coded stream for each message.
  google::protobuf::io::CodedOutputStream output(rawOutput);

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

  uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size);
  if (buffer != NULL) {
    // Optimization: Serialize message directly to array if it fits.
    message.SerializeWithCachedSizesToArray(buffer);
  } else {
    // Slower path for messages spanning multiple buffers.
    message.SerializeWithCachedSizes(&output);
    if (output.HadError()) return false;
  }

  return true;
}

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

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

  return true;
}
Copier après la connexion

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 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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal