DevToolsmith

Protobuf Wire Decoder

Inspect Protobuf binary data without a .proto file. Open a binary file or paste hex or Base64, then examine field numbers, wire types, exact integers, byte offsets and possible nested messages locally.

Runs 100% in your browser — nothing is uploaded

Protobuf bytes
Tip: drop a file here35 chars · 35 bytes · 1 line

Inspect a message by field number

Choose raw, length-delimited stream or uncompressed gRPC framing. The decoder preserves repeated fields in their wire order and reports zero-based byte ranges. Expand a field to compare interpretations. An invalid tag, truncated length, overlong varint or mismatched group stops decoding with a byte location.

Worked wire example
08 96 01 12 03 41 64 61

08       field 1, wire type 0
96 01    unsigned varint 150
12       field 2, wire type 2
03       payload length 3
41 64 61 UTF-8 candidate "Ada"

Read candidates as possibilities

The example’s first value could be an ordinary integer or an enum, and ZigZag interpretation produces a different signed value. The second payload looks like UTF-8 text but could still be declared as bytes. A successful nested parse does not prove that the producer used a nested message.

Files are limited to 1 MB, streams to 100 messages, nesting to eight levels and individual messages to 2,000 fields. The UI shows the first 200 fields at each level. Byte previews stop at 128 bytes and text previews at 512 bytes; the JSON export is a preview, not a lossless conversion.

Have the schema? Use Data File Lab. Need to draft one from example JSON? Try JSON to Protobuf. This tool does not execute messages or contact a gRPC service.

Frequently asked questions

Can Protobuf be decoded without a .proto file?

The wire structure can be inspected without a schema: field numbers, wire types, exact integer payloads, lengths and byte offsets are available. Original field names, enum names and declared types cannot generally be recovered. The tool labels possible signed, string, packed and nested-message interpretations as candidates.

Why are there multiple interpretations of one field?

The same varint can represent an unsigned integer, signed integer, ZigZag value, boolean or enum. A length-delimited payload can be text, bytes, packed fields or another message. The bytes alone do not uniquely determine the declared type, so the tool shows candidates instead of inventing a schema.

Does it support gRPC captures?

It can inspect uncompressed gRPC message frames with a five-byte compression-and-length header, including multiple frames. HTTP/2 frames, base64 gRPC-Web streams, trailers and compressed message payloads must be extracted or decoded separately. A gRPC compression flag is rejected instead of being treated as raw Protobuf.

Are 64-bit values preserved?

Yes. Varints and fixed-width 64-bit integers are decoded with BigInt and shown as decimal strings. The diagnostic JSON uses strings for these values so it does not round them through JavaScript numbers.

Is the JSON export a complete conversion?

No. It is a diagnostic preview with field numbers, offsets and possible interpretations. Byte and text previews are truncated, and unknown semantic types are not guessed as facts. With a schema, use Data File Lab for schema-based message decoding instead.

Sources

Spotted a mistake? Email hello@devtoolsmith.com and we’ll fix it.