C での Java のプロトコル バッファ区切り I/O 関数と同等
C では、「区切り付き」I に直接相当する関数はありません。 Java のプロトコル バッファー API バージョン 2.1.0 で導入された /O 関数。これらの関数により、長さのプレフィックスが付加された複数のプロトコル バッファ メッセージの読み書きが可能になります。
Java 区切り文字付き I/O 関数のワイヤ形式
Java の「区切り文字付き」I/ O 関数は、Google によって文書化されていないワイヤ形式を使用します。ただし、C および Java の protobuf ライブラリの作成者は、同様の関数の非公式実装を提供しています。
<code class="cpp">bool writeDelimitedTo( const google::protobuf::MessageLite& message, google::protobuf::io::ZeroCopyOutputStream* rawOutput) { // Write the size. const int size = message.ByteSize(); output.WriteVarint32(size); // Serialize the message. uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size); if (buffer != NULL) { message.SerializeWithCachedSizesToArray(buffer); } else { message.SerializeWithCachedSizes(&output); } return true; } bool readDelimitedFrom( google::protobuf::io::ZeroCopyInputStream* rawInput, google::protobuf::MessageLite* message) { // 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; // Verify that the entire message was consumed. if (!input.ConsumedEntireMessage()) return false; // Release the limit. input.PopLimit(limit); return true; }</code>
これらの実装により、64 MB のサイズ制限がストリーム全体ではなく各メッセージに個別に適用されることが保証されます。さらに、メッセージ サイズが比較的小さい場合、最適化を利用してパフォーマンスを向上させます。
以上がプロトコルバッファ用に区切り文字付きI/O関数をCで実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。