Implementierung begrenzter I/O-Funktionen in C für Protokollpuffer
In Java wurden mit Protocol Buffers Version 2.1.0 getrennte I/O-Funktionen eingeführt um das Lesen und Schreiben mehrerer Nachrichten aus Dateien zu erleichtern. Diese Funktionen, parseDelimitedFrom, mergeDelimitedFrom und writeDelimitedTo, funktionieren, indem sie Längenpräfixe an die Nachrichten anhängen.
Die ursprüngliche Frage erkundigte sich nach der Existenz gleichwertiger Funktionen für C. Während die Java-API diese Funktionen bereitstellt, fehlten sie der offiziellen C-Bibliothek zunächst. Ab Version 3.3.0 hat Google diese Funktionen jedoch zu google/protobuf/util/delimited_message_util.h hinzugefügt.
Wenn Sie eine ältere Version der C-Bibliothek verwenden, können Sie begrenzte E/A mit implementieren den folgenden Code:
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; }
Das obige ist der detaillierte Inhalt vonWie kann ich begrenzte E/A für Protokollpuffer in C implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!