ホームページ >Java >&#&チュートリアル >区切り文字付き I/O を使用して C でプロトコル バッファー メッセージをエンコードおよびデコードするにはどうすればよいですか?
C で Java のプロトコル バッファー区切り I/O 関数に相当するもの
C と Java の両方で、複数のプロトコルの読み取りと書き込みが必要になります。ファイルからのメッセージをバッファリングします。 Java バージョン 2.1.0 は、この目的のために一連の「区切り付き」I/O 関数を提供します:
これらの関数は、各メッセージの前に長さのプレフィックスを付加することを容易にします。ただし、そのような機能が C に存在するかどうかは不明のままです。
C に相当する関数の存在
当初、これらの Java 関数に直接相当する C 関数はありませんでした。ただし、バージョン 3.3.0 の時点で、C は google/protobuf/util/delimited_message_util.h に区切りメッセージ ユーティリティ関数を備えています。
サイズ プレフィックスの形式
これらの公式ユーティリティがリリースされる前に、C で独自のパーサーを実装しようとしているユーザーは、Java API によって付加されるサイズ プレフィックスのワイヤ形式を理解することが重要です。形式は次のガイドラインに従っています。
最適化された C 実装
公式の C ユーティリティ関数のリリースに続いて、当初提案された実装には欠けているいくつかの最適化が発見されました。以下に示す最適化された関数により、パフォーマンスが向上し、潜在的なエラーが回避されます。
<code class="cpp">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); // Serialize the message directly to the output buffer if possible. uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size); if (buffer != NULL) { message.SerializeWithCachedSizesToArray(buffer); } else { // Use a slower path if the message spans 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; // Set a read limit to enforce the 64 MB per-message size constraint. google::protobuf::io::CodedInputStream::Limit limit = input.PushLimit(size); // Parse the message. if (!message->MergeFromCodedStream(&input)) return false; if (!input.ConsumedEntireMessage()) return false; // Remove the read limit. input.PopLimit(limit); return true; }</code>
以上が区切り文字付き I/O を使用して C でプロトコル バッファー メッセージをエンコードおよびデコードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。