Protobuf Decoder
Decode raw Protocol Buffer (protobuf) wire-format messages without needing a .proto schema. Paste base64 or hex-encoded bytes and inspect every field, wire type, and value - including nested messages.
Decode Options
Recommended Settings
Pro Tips
- •No .proto schema is needed - the decoder reads the raw wire format directly, the same way `protoc --decode_raw` does
- •Varint fields (wire type 0) could be an int32, int64, bool, or enum - the field's meaning depends on your schema
- •Length-delimited fields (wire type 2) are tried as nested messages first, then as UTF-8 strings, then shown as raw bytes
- •Enable alternate interpretations to see a varint's zigzag-decoded value, or a fixed-width field's float/double reading
- •Field numbers repeated across multiple entries usually indicate a 'repeated' field in the original schema
Most Popular
Most users paste base64 data copied from a gRPC debugger or browser dev tools with nested message expansion on
When to Use This Tool
Inspect the raw contents of a gRPC request or response captured from network traffic, without needing access to the service's .proto schema files.
Understand the structure of protobuf-encoded data from a third-party API, mobile app, or binary file when the original schema isn't available.
Confirm that data your service is producing matches the expected field numbers and types before finalizing or updating a .proto schema.
See exactly how Protocol Buffers encode values on the wire - varints, length-delimited fields, and fixed-width fields - for teaching or self-study.
How It Works
Decode the base64 or hex input into raw bytes
Read each field's tag as a varint, splitting it into a field number and wire type
Based on the wire type, read a varint, 8 fixed bytes, a length-delimited byte range, or 4 fixed bytes
For length-delimited fields, recursively attempt to parse the bytes as a nested protobuf message, falling back to a UTF-8 string or raw hex if that fails
Render every field as an indented tree showing its field number, wire type, and decoded value, with alternate numeric interpretations available
100% Private
Files never leave your device. All processing happens locally in your browser.
Lightning Fast
Powered by Pure JavaScript (protobuf wire format parser) for optimal performance on modern browsers.
Secure
No data collection, no tracking, no sign-up required.
Frequently Asked Questions
Do I need the .proto schema to use this tool?
No. This tool decodes the raw protobuf wire format directly, the same way the `protoc --decode_raw` command does. It shows field numbers and wire types without knowing the original field names or exact types, since that information isn't stored in the encoded bytes.
Why does a field show as both a number and other interpretations?
The protobuf wire format only stores a wire type (varint, 64-bit, length-delimited, or 32-bit), not the exact field type from the schema. A varint could be an int32, int64, bool, or enum, and a 32-bit or 64-bit value could be a fixed-width integer or a float/double - the alternate interpretations let you check which reading makes sense for your data.
How are nested messages detected?
For every length-delimited field, the decoder attempts to parse its bytes as a complete embedded protobuf message. If that succeeds and produces at least one valid field, it's shown as a nested message; otherwise the tool falls back to showing it as a UTF-8 string (if valid) or raw bytes.
Can nested-message detection give a false positive?
Occasionally. Some byte sequences - especially short ones - can coincidentally look like a valid nested message. If the nested breakdown doesn't make sense, disable 'Auto-expand nested messages' to see the field as a plain string or hex byte dump instead.
What input formats are supported?
Paste base64-encoded data (common when copying protobuf payloads from browser dev tools or gRPC debuggers) or hex-encoded data, or upload a raw binary file directly - it's automatically converted to hex.