ホームページ > バックエンド開発 > C++ > C でプロトコル バッファーの区切り文字付き I/O を実装するにはどうすればよいですか?

C でプロトコル バッファーの区切り文字付き I/O を実装するにはどうすればよいですか?

DDD
リリース: 2024-12-06 06:11:12
オリジナル
635 人が閲覧しました

How Can I Implement Delimited I/O for Protocol Buffers in C  ?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート