プロトコル バッファーの区切り文字付き I/O 関数: C の同等物
複数のプロトコル バッファー メッセージが両方のファイルから読み書きされるシナリオC および Java では、メッセージに長さのプレフィックスを付ける必要があります。 Java API はこの目的のために専用の「区切られた」I/O 関数を提供しますが、C での同等の関数はすぐには見つからない可能性があります。
最近の更新では、そのような C での同等の関数が google/protobuf/util に存在することが示されています。 /delimited_message_util.h バージョン 3.3.0 の一部として。ただし、この更新の前には、この要件に効率的に対処する代替実装がありました。
そのような実装の 1 つは、C および Java の protobuf ライブラリの元作成者によって提供されており、64MB の入力後の潜在的なエラーを防ぐ最適化が含まれています。 。これらの実装は、以下に示すように、個々のメッセージに 64 MB の制限を適用し、全体の制限を超えることなくストリーミングがシームレスに継続されるようにします。 &&&]
bool writeDelimitedTo( const google::protobuf::MessageLite&メッセージ、 google::protobuf::io::ZeroCopyOutputStream* rawOutput) { // メッセージごとに CodedOutputStream を初期化します。 google::protobuf::io::CodedOutputStream 出力(rawOutput); // メッセージ サイズを決定し、Variant として書き込みます。 int サイズ = message.ByteSize(); 出力.WriteVarint32(サイズ); // 単一のバッファに収まるメッセージを最適化します。 uint8_t* バッファ = 出力.GetDirectBufferForNBytesAndAdvance(サイズ); if (バッファ != NULL) message.SerializeWithCachedSizesToArray(buffer); else message.SerializeWithCachedSizes(&output); true を返します。 } bool readDelimitedFrom( google::protobuf::io::ZeroCopyInputStream* rawInput、 google::protobuf::MessageLite* メッセージ) { // メッセージごとに CodedInputStream を初期化します。 google::protobuf::io::CodedInputStream input(rawInput); // メッセージのサイズを読み取ります。 uint32_t サイズ; if (!input.ReadVarint32(&size)) は false を返します。 // 読み取りを決定されたメッセージ サイズに制限します。 google::protobuf::io::CodedInputStream::Limit 制限 = input.PushLimit(サイズ); // メッセージを解析し、制限内に収まることを確認します。 if (!message->MergeFromCodedStream(&input)) は false を返します。 if (!input.ConsumedEntireMessage()) は false を返します。 // 読み取り制限を解除します。 input.PopLimit(制限); true を返します。 }これらの最適化された実装は、さまざまなサイズのメッセージを効果的に処理し、C の区切り文字付き I/O の信頼できるソリューションを提供します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3