C でのプロトコル バッファー用の区切り文字付き I/O 関数の実装
Java では、プロトコル バッファー バージョン 2.1.0 で区切り文字付き I/O 関数が導入されました。ファイルからの複数のメッセージの読み取りと書き込みを容易にするため。これらの関数、parseDelimitedFrom、mergeDelimitedFrom、および writeDelimitedTo は、メッセージに長さのプレフィックスを付加することによって機能します。
元の質問は、 C の同等の関数の存在について尋ねました。 Java API はこれらの関数を提供しますが、公式の C ライブラリには当初これらの関数がありませんでした。ただし、バージョン 3.3.0 の時点で、Google はこれらの関数を google/protobuf/util/delimited_message_util.h に追加しました。
古いバージョンの C ライブラリを使用している場合は、次を使用して区切り付き I/O を実装できます。次のコード:
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; }
以上がC でプロトコル バッファーの区切り文字付き I/O を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。