検索
ホームページJava&#&チュートリアル区切り文字付き I/O を使用して C でプロトコル バッファー メッセージをエンコードおよびデコードするにはどうすればよいですか?

How Do You Encode and Decode Protocol Buffers Messages in C   Using Delimited I/O?

C で Java のプロトコル バッファー区切り I/O 関数に相当するもの

C と Java の両方で、複数のプロトコルの読み取りと書き込みが必要になります。ファイルからのメッセージをバッファリングします。 Java バージョン 2.1.0 は、この目的のために一連の「区切り付き」I/O 関数を提供します:

  • parseDelimitedFrom
  • mergeDelimitedFrom
  • writeDelimitedTo

これらの関数は、各メッセージの前に長さのプレフィックスを付加することを容易にします。ただし、そのような機能が C に存在するかどうかは不明のままです。

C に相当する関数の存在

当初、これらの Java 関数に直接相当する C 関数はありませんでした。ただし、バージョン 3.3.0 の時点で、C は google/protobuf/util/delimited_message_util.h に区切りメッセージ ユーティリティ関数を備えています。

サイズ プレフィックスの形式

これらの公式ユーティリティがリリースされる前に、C で独自のパーサーを実装しようとしているユーザーは、Java API によって付加されるサイズ プレフィックスのワイヤ形式を理解することが重要です。形式は次のガイドラインに従っています。

  • 最初のメッセージの前であっても区切り文字が存在する必要があります。
  • メッセージのサイズは 32 ビットのバリアントとしてエンコードされます。
  • 1 バイトの区切りバイト (0x0A) で各メッセージが終了し、その直後に次の長さのプレフィックスが付いたメッセージが始まります。

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

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境