Protocol Buffers (Protobuf) is Google’s compact binary serialization format, used heavily in gRPC APIs and high-performance services. Normally you need the matching .proto schema to decode a message, but the wire format carries enough structure to parse without one. This tool reverse-engineers raw Protobuf bytes into field numbers, wire types and candidate values, which is invaluable when inspecting API traffic you do not have the schema for.
How it works
Every Protobuf field on the wire begins with a varint key that packs two pieces of information: field_number << 3 | wire_type. The wire type tells the decoder how to read the payload that follows:
- Wire type 0 (varint) — covers
int32,int64,uint,sint(zigzag-encoded),boolandenum. The tool shows the plain integer, the zigzag-decoded signed value, and a bool reading when the value is 0 or 1. - Wire type 1 (64-bit) — eight little-endian bytes shown as
fixed64,sfixed64anddouble. - Wire type 2 (length-delimited) — a varint length then that many bytes. This could be a UTF-8 string, raw
bytes, an embedded message, or a packed repeated field, so the tool tries each. - Wire type 5 (32-bit) — four little-endian bytes shown as
fixed32,sfixed32andfloat.
Length-delimited payloads are recursively re-parsed as embedded messages, so deeply nested structures are revealed automatically.
Example
The hex 08 96 01 12 07 74 65 73 74 69 6e 67 decodes to two fields:
Field 1 (varint): 150
Field 2 (length-delimited): string "testing"
08 is the key for field 1, wire type 0; the varint 96 01 decodes to 150. 12 is the key for field 2, wire type 2; 07 is the length and the next seven bytes spell testing. Because there is no schema, field names are not recoverable — only numbers, types and values. Everything runs locally in your browser.