PROTOBUF WIRE DECODER
The wire format carries field numbers, not names, so bytes alone can be decoded a long way without the schema — which is exactly what protoc --decode_raw does, and what this does without installing anything.
Hover a field above to light up the bytes it came from. The tag byte carries both the field
number and the wire type — (number << 3) | wire_type — which is
why field 1 with a length-delimited payload always starts 0a.
A starting point, not the truth: the wire format cannot tell you a field's name, whether a number was meant as signed, or whether a repeated field was packed by choice. Anything marked with a comment is a guess the bytes cannot settle.
Wire type 2 is the ambiguous one: a string, a byte blob, a nested message and a packed repeated field all look identical on the wire. This page tries all four and shows you which ones are self-consistent — a payload that parses cleanly as a message usually is one, but a short string of the right shape can parse as a message too, and there is no way to be sure without the schema.
"A field number, a wire type, and a length. Everything else is convention."