バイトから構造を読む

Protobufデコーダー

まず生のwireデータを確認し、名前や型が必要な場合だけ自己完結した.proto定義を追加します。

Protobufデコーダー

入力

任意の.proto定義

結果

バイトと定義はこのブラウザー内で処理し、送信しません。

オプション

wireメッセージまたはvarintを入力してください。

ログにバイナリだけ残っているとき、Protobufデコーダーはフィールド番号とwire型をバイト位置に結び付けます。.protoなしでも、どこで値が始まり終わるかは確かめられます。

ただしワイヤーフォーマットはフィールド名を保存しません。長さ付きの値は文字列、bytes、埋め込みメッセージ、packed値のどれにもなり得るため、候補表示を確定した型として扱わないでください。

Protobufデコーダーを使う理由

推測の横に元のバイトを残します。

位置を元データへたどれる

Protobufデコーダーは各フィールドに0始まりの開始・終了オフセット、wire型、元のhexを表示します。長さが不足した場合も失敗位置を示し、キャプチャとの照合を助けます。

並んだバイトが番号付きフィールドに分かれ、それぞれの範囲へ線でつながる図。

スキーマを足しても生データは残る

単一の.protoを貼り、メッセージ型を選ぶと名前付きJSONを確認できます。型付きの結果と生のフィールド表示を並べ、値の出所を見失いません。

生のフィールド構造とスキーマに沿った値の構造を対応させた図。

値を信用する前の三つの確認

01

入力形式を明示する

初期値はhexです。空白、コロン、0x接頭辞を許容します。Base64のデータは切り替えてください。短い文字列は両形式として成立することがあります。

02

複数の読み方を比べる

wire型0のvarintはunsigned、signed、ZigZag、boolなどの候補を持ちます。wire型2も文字列と子メッセージを区別できません。宣言型は.protoで確認します。

03

更新状態と位置を見る

自動デコードは入力後350ミリ秒待ちます。オフならCtrl/Cmd + Enterで実行できます。変更直後の結果は古くなり、コピーとダウンロードは止まります。

wireから確認できる情報

四つの主なwire型

Protobufデコーダーはvarint、fixed64、長さ付き、fixed32を読みます。途中で切れた値や旧式groupはその位置でエラーにし、残りを黙って飛ばしません。

64ビットのvarint変換

varintデコードと十進数からの逆変換を一つのページで扱います。BigIntでuint64とZigZag sint64を計算し、JavaScriptのNumberに由来する精度落ちを避けます。

宣言に沿ったJSON

自己完結した.protoがあれば、複数のメッセージから対象を選び、繰り返しや入れ子を型付きで表示できます。スキーマが失敗しても生のwire結果は残ります。

入力そのままのhex出力

Protobufデコーダーが保存するhexは入力バイトの表記を整えたものです。推測した型から再符号化しないため、パケットと比較できます。

バイトだけでは決まらない意味

名前はスキーマが必要
Protobufデコーダーは.protoなしでは番号とwire型までしか確定できません。元のフィールド名、列挙名、oneofの関係は復元できません。
文字列らしさは証明ではない
UTF-8として読める値が、実際はbytesや入れ子メッセージかもしれません。候補の表示をアプリケーションの型断定に使わないでください。
単一のローカル定義だけ
importや遠隔URLからの.proto取得は行いません。依存する型は先にプロジェクト側で解決し、自己完結した定義を貼ってください。
gRPCの枠は外さない
入力は生のProtobufメッセージです。gRPCの5バイトヘッダーや圧縮を自動処理せず、JSONからメッセージ全体を生成する機能もありません。

Protobufデコーダーのよくある質問

.protoファイルなしでprotobufをデコードできますか。

はい。フィールド番号、wire型、位置と元の値は読めます。ただし元の名前と正確な型には一致する.protoが必要です。

protobufのワイヤータイプは何を意味しますか。

タグに含まれる低い3ビットが値の保存方式を示します。これだけではstringやbytesなどの宣言型までは決まりません。

protobufはhexとbase64のどちらで貼り付けるべきですか。

データがhexならHex、Base64文字列ならBase64を選びます。形式は自動判定しないので、元の保存形式を確認してください。

なぜvarintが複数の異なる数値として表示されるのですか。

同じビット列がuint64やZigZag sint64などに読めるためです。スキーマの宣言を見るまでは候補を併記します。

デコードしたペイロードはどこかにアップロードされますか。

いいえ。デコードも任意の.proto解析もブラウザー内で行い、ペイロードをサーバーへ送信しません。

対応すべき定義で問題がありましたか?

次のペイロードもProtobufデコーダーで確認

Protobufデコーダーで得たオフセットと元のhexを手掛かりにし、必要なら.protoの宣言と照合して解釈を確定してください。