Java のプロトコル バッファー区切り I/O 関数に相当する C
質問:
C および Java では、長さを使用してプロトコル バッファー メッセージをファイルに読み書きする方法接頭辞? Java API にはこの目的のための「区切り文字付き」I/O 関数がありますが、C には同等の関数はありますか?そうでない場合、サイズ接頭辞の基礎となるワイヤ形式は何ですか?
答え:
バージョン 3.3.0 の時点で、C には同等の関数が含まれています。 google/protobuf/util/delimited_message_util.h. これらの関数は、以前に提案されたものよりも高速で最適化された実装を提供します。
元の実装:
公式の同等物が導入される前は、次の最適化された C 実装が利用可能でした:
bool writeDelimitedTo( const google::protobuf::MessageLite& message, google::protobuf::io::ZeroCopyOutputStream* rawOutput) { // Use a new coded stream for each message (fast). google::protobuf::io::CodedOutputStream output(rawOutput); // Write the size. const int size = message.ByteSize(); output.WriteVarint32(size); uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size); if (buffer != NULL) { // Optimization: Direct-to-array serialization for messages in a single buffer. message.SerializeWithCachedSizesToArray(buffer); } else { // Slower path for messages across multiple buffers. message.SerializeWithCachedSizes(&output); if (output.HadError()) return false; } return true; } bool readDelimitedFrom( google::protobuf::io::ZeroCopyInputStream* rawInput, google::protobuf::MessageLite* message) { // Each message uses its own coded stream (fast). google::protobuf::io::CodedInputStream input(rawInput); // 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; if (!input.ConsumedEntireMessage()) return false; // Release the limit. input.PopLimit(limit); return true; }
以上がC および Java で長さのプレフィックスを含むプロトコル バッファー メッセージを読み書きする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。