本文へスキップ

Protobufデコーダー

Protobuf Decoder

.protoファイルなしでprotobufのペイロードを解き、フィールド番号・ワイヤ型・入れ子を推定します。

`.proto`ファイルなしでprotobufのペイロードを解読します。ワイヤフォーマット——フィールド番号、ワイヤ型、入れ子——を読み、値ごとに成り立つ解釈をすべて並べて見せます。スキーマが無ければ、解釈は本当に1つではないからです。

🔒 ブラウザの中だけで動きますprotobufdecodebinarygrpc

ペイロード

バイナリのペイロードをドロップ

このタブで解読します。どこにもアップロードしません。

フィールド

最上位フィールド

3

全体のサイズ

17 byte

  • #1VARINT@0, 3 Buint 150 · zigzag 75
  • #2LEN@3, 9 B"testing"
  • #3LEN@12, 5 Bメッセージ(フィールド 1個)
    • #1VARINT@0, 3 Buint 150 · zigzag 75

JSON で見る(名前の代わりにフィールド番号)

.proto ファイルがないとフィールド名は分からず、同じペイロードが複数の読み方で成り立ちます。ですから varint は符号なし・符号あり・ジグザグをまとめて示し、長さ付きフィールドはメッセージ・テキスト・バイト列として並べて示します。画面の入れ子は、すべてのバイトがちょうど収まる読み方です。ほかの読み方は隠さず、隣に書いてあります。

使い方

  1. バイト列を貼り付けるか、ファイルをドロップします

    空白があってもなくても16進数、あるいはBase64を受け付けます。代わりに32MBまでのバイナリファイルを置くこともできます。

  2. フィールドの一覧を読みます

    行ごとに、フィールド番号、ワイヤ型、バイトのオフセットと長さ、そして解釈が出ます。入れ子のメッセージは、親の下にインデントして示します。

  3. JSONへの投影を持っていきます

    同じ木をJSONにしたものです。名前のところにフィールド番号が入ります。2つのペイロードを比べたり、issueに貼り付けたりするのに使えます。

よくある質問

フィールド名が無いのはなぜですか

protobufが名前を通信路に載せないからです。符号化されたメッセージにはフィールドの*番号*しか入っておらず、名前は`.proto`ファイルの中にあります。だからこの形式は小さく、だからスキーマ無しの解読は番号までしか見せられません。

1つの値が3通りに出るのはなぜですか

通信路の上のvarintは、ただのビットだからです。同じバイト列が、正しい`uint64`でもあり、正しい`int64`でもあり、正しいジグザグの`sint64`でもあります。どれなのかを知っているのはスキーマだけです。1つだけを見せて残りを隠せば、推測を事実として差し出すことになります。

入れ子のメッセージだとどう判断していますか

長さの付いたフィールドは、メッセージかもしれませんし、文字列かもしれませんし、ただのバイト列かもしれません。中身が完全にパースできるとき——すべてのバイトが消費され、余りが出ないとき——にメッセージとして見せ、そのバイト列が表示可能なテキストでもあれば、文字列としての解釈を横に並べます。短い文字列がたまたまメッセージとしてパースできてしまうこともときどきあるので、両方の解釈を置いて、判断できるようにしてあります。

gRPCの通信も解読できますか

メッセージの本体なら解読できます。先頭にある5バイトのgRPCのフレームヘッダー——圧縮フラグ1バイトと、ビッグエンディアンの長さ4バイト——を外してから入れてください。その後ろのバイト列を渡せば、いつもどおり解読します。

ここから渡せます

次の一手

このツールが出したものをそのまま受け取れる道具です。